Lui*_*reu 7 oauth-2.0 azure-active-directory bearer-token azure-ad-msal
我正在使用 MSAL 获取 ID 令牌,然后将其用于访问 Web API 应用程序。我有几个问题,我想知道是否有人可以帮助我了解发生了什么。
让我从客户端的身份验证过程开始。在这种情况下,我正在构建一个 Windows 窗体应用程序,该应用程序使用以下代码来验证当前用户的身份(即,为了获取 ID 令牌,当用户尝试访问 Web API 应用程序):
//constructor code
_clientApp = new PublicClientApplication(ClientId,
Authority, //which url here?
TokenCacheHelper.GetUserCache());
_scopes = new []{ "user.read" }; //what to put here?
//inside a helper method
try {
return await _clientApp.AcquireTokenSilentAsync(_scopes, _clientApp.Users.FirstOrDefault());
}
catch (MsalUiRequiredException ex) {
try {
return await _clientApp.AcquireTokenAsync(_scopes);
}
catch (MsalException ex) {
return null;
}
}
Run Code Online (Sandbox Code Playgroud)
我想清除的第一件事是应该用于 authority 参数的值。在这种情况下,我在表单上使用 URL:
https://login.microsoftonline.com/{Tenant}/oauth2/v2.0/token
Run Code Online (Sandbox Code Playgroud)
但是,我的印象是我也可以摆脱这样的事情:
https://login.microsoftonline.com/common/v2.0/.well-known/openid-configuration
似乎一个端点特定于我的 Azure AD,而另一个看起来像一个通用的(捕获所有)URL……我在哪里可以找到有关这些端点的更多信息以及每个端点的用途……
我无法完全掌握的另一件事是范围。我对查询 MS Graph(或与此相关的任何其他 Azure 相关服务)不感兴趣。在以前版本的 MSAL 库中,可以引用默认范围之一。然而,这似乎不再可能(至少,我尝试过并得到一个例外,说我不应该传递默认范围......)。
传递空集合(例如:)new List<string>()或null也会导致错误。所以,在这种情况下,我已经结束传递user.read范围(如果我没记错的话,它被 MS Graph API 使用。这显然没有必要,但这是我设法获得身份验证过程的唯一方法工作。当您只需要获取 ID 令牌时,有关如何执行呼叫的任何线索?我应该调用不同的方法吗?
转到服务器端,我有一个 Web API 应用程序,它的访问仅限于在身份验证标头(承载)中传递 ID 令牌的调用。根据这个示例,我应该使用这样的东西:
private void ConfigureAuth(IAppBuilder app) {
var authority = "https://login.microsoftonline.com/common/v2.0/.well-known/openid-configuration";
app.UseOAuthBearerAuthentication(
new OAuthBearerAuthenticationOptions {
AccessTokenFormat = new JwtFormat(GetTokenValidationParameters(),
new OpenIdConnectCachingSecurityTokenProvider(authority)),
Provider = new OAuthBearerAuthenticationProvider {
OnValidateIdentity = ValidateIdentity
}
});
}
Run Code Online (Sandbox Code Playgroud)
现在,这确实有效,它将为所有没有有效 ID 令牌的请求返回 401。但是有一个问题:有没有办法从票证的身份中指定用于识别用户名(User.Identity.Name控制器的)的声明?在这种情况下,我已经结束处理OnValidateIdentity,以便使用如下所示的代码执行此操作:
private Task ValidateIdentity(OAuthValidateIdentityContext arg) {
//username not getting correctly filled
//so, i'm handling this event in order to set it up
//from the preferred_username claim
if (!arg.HasError && arg.IsValidated) {
var identity = arg.Ticket.Identity;
var username = identity.Claims.FirstOrDefault(c => c.Type == "preferred_username")?.Value ?? "";
if (!string.IsNullOrEmpty(username)) {
identity.AddClaim(new Claim(ClaimTypes.Name, username));
}
}
return Task.CompletedTask;
}
Run Code Online (Sandbox Code Playgroud)
如您所见,我正在从 ID 令牌(由客户端获取)中搜索 preferred_username 声明,并使用其值来设置 Name 声明。是否有任何选项可以让我自动执行此操作?我在配置中遗漏了什么OAuthBearerAuthenticationMiddleware吗?
关于您的第一个查询 - 我在哪里可以找到有关这些端点以及每个端点的用途的更多信息...
答案- https://login.microsoftonline.com/ {tenant} /v2.0/.well-known/openid-configuration
{ tenant }可以采用四个值之一:
常见- 拥有个人 Microsoft 帐户和 Azure Active Directory (Azure AD) 的工作或学校帐户的用户可以登录到该应用程序。
组织- 只有拥有 Azure AD 工作或学校帐户的用户才能登录该应用程序。
消费者- 只有拥有个人 Microsoft 帐户的用户才能登录该应用程序。
8eaef023-2b34-4da1-9baa-8bc8c9d6a490或contoso.onmicrosoft.com - 只有拥有特定 Azure AD 租户的工作或学校帐户的用户才能登录该应用程序。可以使用 Azure AD 租户的友好域名或租户的 GUID 标识符。
关于您对范围的第二次查询-
答案- 请参阅本文档 - OpenID Connect 范围
关于您的第三次索赔查询-
答案- 请参阅此 GIT Hub 示例 - active-directory-dotnet-webapp-roleclaims
| 归档时间: |
|
| 查看次数: |
10164 次 |
| 最近记录: |