Azure广告在声明中返回角色但User.IsInRole返回false

时间:2016-04-07 21:21:35

标签: c# azure roles azure-active-directory

知道可能导致这种情况的原因是什么?我可以在User.Claims中看到声明我唯一能想到的是Azure广告角色的声明与IsInRole()检查的声明有何不同?

CorpAdmin Role showing in claims.

User.IsInRole returns false

[Startup.Auth] [3]

只是为了澄清,我正在恢复角色,但我认为它们没有正确地添加到声明列表中,我无法弄清楚原因。 Nerith IsInRole或[Authorize(Roles =“...”)]将正确检查角色声明。

5 个答案:

答案 0 :(得分:7)

这些变化中的任何一项都对我有用:

            TokenValidationParameters = new TokenValidationParameters()
            {
                ValidateIssuer = false,
                RoleClaimType = System.Security.Claims.ClaimTypes.Role
            },

            TokenValidationParameters = new TokenValidationParameters()
            {
                ValidateIssuer = false,
                RoleClaimType = "http://schemas.microsoft.com/ws/2008/06/identity/claims/role"
            },

答案 1 :(得分:2)

您需要指定包含角色的声明类型的名称。像这样:

TokenValidationParameters = new TokenValidationParameters
{
    ValidateIssuer = true,
    RoleClaimType = "roles"
},

答案 2 :(得分:1)

经过大量挖掘,我发现了问题出在我们身上,其中一些答案是正确的,但前提是您尚未将App Service配置为启用Azure AD。 enter image description here

如果执行此操作,将不会使用代码中定义的RoleClaimType,并将其设置为默认值“ http://schemas.microsoft.com/ws/2008/06/identity/claims/role”,但您所有的角色声明都是“角色”。

解决方案是基本上将索赔从“角色”复制到ClaimsIdentity.RoleClaimType。找到解决方案here并在上面提到。

解决方案:

public void ConfigureAuth(IAppBuilder app)
{
    //This setting ensures that we use the specified TokenValidationParameters.RoleClaimType below
    JwtSecurityTokenHandler.DefaultMapInboundClaims = false;

    app.SetDefaultSignInAsAuthenticationType(CookieAuthenticationDefaults.AuthenticationType);
    app.UseCookieAuthentication(new CookieAuthenticationOptions());
    app.UseOpenIdConnectAuthentication(
        new OpenIdConnectAuthenticationOptions
        {
            //Omitted some stuff
            TokenValidationParameters = new TokenValidationParameters()
            {
                ValidateIssuer = true,
                RoleClaimType = "roles"
            }
        }
    );

    //Configure out OnAuth Method to fix the roles post auth
    app.Use((context, next) =>
    {
        OnAuth(context);
        return next.Invoke();
    });
    app.UseStageMarker(PipelineStage.PostAuthenticate);
}

private static void OnAuth(IOwinContext context)
{
    if (ClaimsPrincipal.Current.Identity.IsAuthenticated)
    {
        var claimsPrincipal = ClaimsPrincipal.Current;
        var claimsIdentity = claimsPrincipal.Identity as ClaimsIdentity;
        var appRoles = new List<Claim>();

        //local dev will be right
        if (claimsIdentity.RoleClaimType == "roles")
            return;

        //Find all the claims with "roles" and add a copy claim with the correct RoleClaimType.
        foreach (Claim claim in claimsPrincipal.FindAll("roles"))
            appRoles.Add(new Claim(claimsIdentity.RoleClaimType, claim.Value));

        if (appRoles.Count > 0)
            claimsIdentity.AddClaims(appRoles);
    }
}

答案 3 :(得分:0)

如果您遇到与我相同的问题,我创建了一个自定义的AuthorizeAttribute类,我忘记覆盖AuthorizeCore函数。添加以下代码解决了我的问题。

    //Core authentication, called before each action
    protected override bool AuthorizeCore(HttpContextBase httpContext)
    {
        return base.AuthorizeCore(httpContext);
    }

答案 4 :(得分:-1)

complex