知道可能导致这种情况的原因是什么?我可以在User.Claims中看到声明我唯一能想到的是Azure广告角色的声明与IsInRole()检查的声明有何不同?
CorpAdmin Role showing in claims.
[Startup.Auth] [3]
只是为了澄清,我正在恢复角色,但我认为它们没有正确地添加到声明列表中,我无法弄清楚原因。 Nerith IsInRole或[Authorize(Roles =“...”)]将正确检查角色声明。
答案 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。
如果执行此操作,将不会使用代码中定义的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