MSAL和Azure AD:当我只想获得用户ID时,我应该通过哪些作用域



我正在使用MSAL获取ID令牌,然后用于访问Web API应用程序。我有几个问题,我想知道是否有人能帮我了解发生了什么。

让我从客户端的身份验证过程开始。在这种情况下,我正在构建一个Windows窗体应用程序,该应用程序使用以下代码来验证当前用户(即,当用户尝试访问Web API应用程序时,为了获得将用于验证用户的ID令牌):

//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;
}
}

我想澄清的第一件事是应该用于authority参数的值。在这种情况下,我在表单上使用一个URL:

https://login.microsoftonline.com/{Tenant}/oauth2/v2.0/token

然而,我的印象是,我也可以逃脱这样的惩罚:

https://login.microsoftonline.com/common/v2.0/.well-known/openid-configuration

看起来一个端点是特定于我的Azure AD的,而另一个端点看起来像是通用(包罗万象)URL。。。我在哪里可以找到更多关于这些端点的信息,以及每个端点的目的是什么。。。

另一件我不能完全理解的事情是范围。我对查询MS Graph(或任何其他与Azure相关的服务)不感兴趣。在MSAL库的早期版本中,可以引用一个默认作用域。然而,这似乎已经不可能了(至少,我尝试过了,但得到了一个异常,说我不应该通过默认范围…)

传递空集合(例如:new List<string>())或null也会导致错误。因此,在这种情况下,我已经结束了通过user.read作用域(如果我没有错的话,它是由MSGraph 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
}
});
}

现在,这确实有效,它将为所有没有有效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;
}

正如您所看到的,我正在从ID Token(由客户端获得)中搜索preferred_username声明,并使用其值来设置Name声明。有没有什么选项可以让我自动做到这一点?我在OAuthBearerAuthenticationMiddleware的配置中遗漏了什么吗?

关于您的第一次查询-我在哪里可以找到更多关于这些端点的信息,以及每个端点的目的是什么

答案-https://login.microsoftonline.com/{tenant}/v.20/.openid配置

{tenant}可以取四个值之一:

  1. 常见-同时拥有个人Microsoft帐户和Azure Active Directory(Azure AD)的工作或学校帐户的用户可以登录该应用程序。

  2. 组织-只有拥有Azure AD的工作或学校帐户的用户才能登录该应用程序。

  3. 消费者-只有拥有个人Microsoft帐户的用户才能登录到该应用程序。

  4. 8eaef023-2b34-4da1-9baa-8bc8c9d6a490contoso.on.microsoft.com-只有具有特定Azure AD租户的工作或学校帐户的用户才能登录该应用程序。可以使用Azure AD租户的友好域名或租户的GUID标识符。

关于第二次查询作用域-

答案-请参阅本文档-OpenID Connect作用域

关于您的第三次查询索赔-

答案-请参阅此GIT Hub示例-active directory dotnet网络应用程序角色声明

相关内容

最新更新