gpt4 book ai didi

oauth-2.0 - MSAL 和 Azure AD : What scopes should I pass when I just want to get the user ID?

转载 作者:行者123 更新时间:2023-12-03 08:01:44 26 4
gpt4 key购买 nike

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

让我从客户端的身份验证过程开始。在这种情况下,我正在构建一个 Windows 窗体应用程序,该应用程序使用以下代码来验证当前用户的身份(即,为了获取 ID token ,当用户尝试访问 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;
}
}

我想清除的第一件事是应该用于 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 库中,可以引用默认范围之一。然而,这似乎不再可能(至少,我尝试过并得到一个异常(exception),说我不应该传递默认范围......)。

传递一个空集合(例如: new List<string>() )或 null也会导致错误。所以,在这种情况下,我已经结束通过 user.read范围(如果我没记错的话,它是由 MS Graph API 使用的。这显然不是必需的,但这是我设法使身份验证过程正常工作的唯一方法。有关如何执行调用的任何线索只需要获得一个 ID token ?我应该调用不同的方法吗?

转到服务器端,我有一个 Web API 应用程序,它的访问仅限于在身份验证 header (承载)中传递 ID token 的调用。根据这个 sample ,我应该使用这样的东西:
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 token 的请求返回 401。但是有一个问题:有没有办法从票证的身份中指定用于识别用户名的声明( Controller 的 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/ {租户} /v2.0/.well-known/openid-configuration

{租户} 可以采用以下四个值之一:

  • 普通 ——
    拥有个人 Microsoft 帐户和来自 Azure Active Directory (Azure AD) 的工作或学校帐户的用户可以登录到应用程序。
  • 组织 ——
    只有拥有来自 Azure AD 的工作或学校帐户的用户才能登录到应用程序。
  • 消费者 ——
    只有拥有个人 Microsoft 帐户的用户才能登录该应用程序。
  • 8eaef023-2b34-4da1-9baa-8bc8c9d6a490 contoso.onmicrosoft.com ——
    只有拥有来自特定 Azure AD 租户的工作或学校帐户的用户才能登录到应用程序。可以使用 Azure AD 租户的友好域名或租户的 GUID 标识符。

  • 关于您的 第二 范围查询 -

    答案 - 请参阅此文档 - OpenID Connect scopes

    关于您的 第三 claim 查询 -

    答案 - 请参阅此 GIT Hub 示例 - active-directory-dotnet-webapp-roleclaims

    关于oauth-2.0 - MSAL 和 Azure AD : What scopes should I pass when I just want to get the user ID?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47240071/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com