【问题标题】:OpenIDConnectAuthentication is not working with some users in the Azure Active DirectoryOpenIDConnectAuthentication 不适用于 Azure Active Directory 中的某些用户
【发布时间】:2020-07-21 15:29:08
【问题描述】:

我在 azure K100UserK100Admin 中有两个 AD 组。下面的代码运行良好,但此代码不适用于超过 200 个 AD 组的用户。

private static string clientId = ConfigurationManager.AppSettings["ida:ClientId"];
private static string aadInstance = EnsureTrailingSlash(ConfigurationManager.AppSettings["ida:AADInstance"]);
private static string tenantId = ConfigurationManager.AppSettings["ida:TenantId"];
private static string postLogoutRedirectUri = ConfigurationManager.AppSettings["ida:PostLogoutRedirectUri"];
private static string authority = aadInstance + tenantId;
private static string k100User = ConfigurationManager.AppSettings["K100User"];
private static string k100Admin = ConfigurationManager.AppSettings["K100Admin"];

public void ConfigureAuth(IAppBuilder app)
{
    ClaimsIdentity claimsIdentity1 = ClaimsPrincipal.Current.Identity as ClaimsIdentity;
    app.SetDefaultSignInAsAuthenticationType(CookieAuthenticationDefaults.AuthenticationType);
    app.UseCookieAuthentication(new CookieAuthenticationOptions());
    app.UseOpenIdConnectAuthentication(new OpenIdConnectAuthenticationOptions
    {
        ClientId = clientId,
        Authority = authority,
        PostLogoutRedirectUri = postLogoutRedirectUri,
        TokenValidationParameters = new System.IdentityModel.Tokens.TokenValidationParameters
        {
            ValidateIssuer = true
        },
        Notifications = new OpenIdConnectAuthenticationNotifications
        {
            SecurityTokenValidated = (ctx) =>
            {
                ClaimsIdentity claimsIdentity = ClaimsPrincipal.Current.Identity as ClaimsIdentity;
                var claims = ctx.AuthenticationTicket.Identity.FindAll("groups");
                var appRoles = new List<Claim>();
                foreach (var item in claims)
                {
                    var groupStringValue = item.Value;
                    if (groupStringValue == k100Admin)
                    {
                        appRoles.Add(new Claim(ClaimTypes.Role, "K100Admin", ClaimValueTypes.String));
                    }
                    else if (groupStringValue == k100User)
                    {
                        appRoles.Add(new Claim(ClaimTypes.Role, "K100User", ClaimValueTypes.String));
                    }

                }
                if (appRoles.Count > 0)
                {
                    ctx.AuthenticationTicket.Identity.AddClaim(appRoles[0]);
                }
                return Task.FromResult(0);
            }
        }
    });
}

【问题讨论】:

  • 您确定您没有获得某些 Azure AD 服务限制和限制吗? docs.microsoft.com/en-gb/azure/active-directory/…
  • 顺便说一句。该代码的主要目标是什么?
  • @LukeDuda 请帮我修改此代码,它不适用于超过 200 个 AD 组的用户

标签: oauth-2.0 azure-active-directory microsoft-graph-api openid-connect


【解决方案1】:

看看Groups overage claim

在您的场景中,用户是 200 多个组的成员,因此您需要检查声明 _claim_names,其中一个值为组。如果找到,请调用_claim_sources 中指定的端点以获取用户组。

您也可以选择直接调用 Microsoft Graph List memberOf 获取群组。

一个类似的thread供你参考。

【讨论】:

  • 我不明白。我是 Azure AD 和 oAuth 的新手 :(
  • @ILYASKHAN 在您的代码中,您通过使用var claims = ctx.AuthenticationTicket.Identity.FindAll("groups"); 获得了groups 声明。但如果用户是 200 多个组的成员,则不会有 groups 声明。应该有一个_claim_names 声明。您应该找到此声明并致电endpoint 以获取用户组。
  • 我已经粘贴了上面修改过的代码,请查收。是你想让我改变的方式吗?
  • IEnumerable 声明 = ctx.AuthenticationTicket.Identity.Claims; Claim objectAdmin = claim.First(claim => claim.Value == k100Admin); if (objectAdmin != null) {appRoles.Add(new Claim(ClaimTypes.Role, "K100Admin", ClaimValueTypes.String));} if (appRoles.Count > 0){ctx.AuthenticationTicket.Identity.AddClaim(appRoles[0 ]);} return Task.FromResult(0);
  • @ILYASKHAN 不。您应该在代码中检查_claim_names 声明而不是groups。它会要求您致电 Microsoft Graph 以获取组。所以推荐的方法是直接调用Microsoft Graph。看到这个答案:stackoverflow.com/questions/58091323/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-08-12
  • 2017-03-07
  • 1970-01-01
  • 1970-01-01
  • 2018-11-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多