我为角色创建了基于菜单,其内容遵循此教程。在该页面的某个地方,您会看到以下代码行:
String[] roles = Roles.GetRolesForUser();
它返回当前登录用户的所有角色。我想知道如何在新的ASP.NET身份验证系统中实现这一点?
它仍然很新,关于它的资料不多。
我为角色创建了基于菜单,其内容遵循此教程。在该页面的某个地方,您会看到以下代码行:
String[] roles = Roles.GetRolesForUser();
它返回当前登录用户的所有角色。我想知道如何在新的ASP.NET身份验证系统中实现这一点?
它仍然很新,关于它的资料不多。
Controller.User.Identity
是一个 ClaimsIdentity
。你可以通过检查声明来获取角色列表...
var roles = ((ClaimsIdentity)User.Identity).Claims
.Where(c => c.Type == ClaimTypes.Role)
.Select(c => c.Value);
--- 更新 ---
进一步分解如下...
using System.Security.Claims;
// ........
var userIdentity = (ClaimsIdentity)User.Identity;
var claims = userIdentity.Claims;
var roleClaimType = userIdentity.RoleClaimType;
var roles = claims.Where(c => c.Type == ClaimTypes.Role).ToList();
// or...
var roles = claims.Where(c => c.Type == roleClaimType).ToList();
ClaimTypes
中没有 Role
。我需要添加它或者做些什么吗? - QuoterSystem.Security.Claims.ClaimTypes
http://msdn.microsoft.com/en-us/library/system.security.claims.claimtypes(v=vs.110).aspxгҖӮжӯӨеӨ–пјҢ`ClaimsIdentity`еҜ№иұЎиҝҳе…·жңүдёҖдёӘ`RoleClaimType`еұһжҖ§пјҢе…¶дёӯеҢ…еҗ«зӣёеҗҢзҡ„еҖјпјҢжӮЁеҸҜд»ҘдҪҝз”ЁиҜҘеұһжҖ§д»ЈжӣҝгҖӮ - Anthony ChuRoleClaimType
。 - Quoter这是以上解决方案的一个扩展方法。
public static List<string> Roles(this ClaimsIdentity identity)
{
return identity.Claims
.Where(c => c.Type == ClaimTypes.Role)
.Select(c => c.Value)
.ToList();
}
SignInManager
中获取身份用户后,调用UserManager
上的GetRolesAsync
并将身份用户作为参数传递。它将返回身份用户已注册的角色列表。var rolesList = await userManager.GetRolesAsync(identityuser).ConfigureAwait(false);
我认为这些答案都不完全正确,因为它们都只考虑了已登录用户的主身份。User
是ClaimsPrincipal
,可以有多个身份(ClaimsPrincipal.Identities
属性)。而ClaimsPrincipal.Identity
则是这些身份的主身份。所以要获取用户所有的角色,需要从所有身份中获取其角色。这也是内置的ClaimPrincipal.IsInRole(string roleName)
方法的作用,即检查给定的roleName
是否存在于任何一个身份中。
因此,获取所有角色的正确方式应该像这样:
public static class ClaimsPrincipalExtensions
public static IEnumerable<string> GetRoles(this ClaimsPrincipal principal)
{
return principal.Identities.SelectMany(i =>
{
return i.Claims
.Where(c => c.Type == i.RoleClaimType)
.Select(c => c.Value)
.ToList();
});
}
}
并被用作
var roles = User.GetRoles()
Identity.RoleClaimType
,而不是静态声明类型ClaimTypes.Role
。这是必要的,因为角色声明类型可以根据标识进行覆盖,例如当通过提供自定义声明名称作为角色声明类型的JWT令牌接收标识时。不要使用 @using System.IdentityModel.Claims 命名空间,而是应该使用
@using System.Security.Claims
@using System.Security.Claims
@using Microsoft.AspNet.Identity
@{
var claimsIdentity = User.Identity as System.Security.Claims.ClaimsIdentity;
var customUserClaim = claimsIdentity != null ? claimsIdentity.Claims.FirstOrDefault(x => x.Type == "cutomType") : null;
var customTypeValue= customUserClaim != null ? customUserClaim .Value : User.Identity.GetUserName();
var roleOfUser = claimsIdentity != null ? claimsIdentity.Claims.FirstOrDefault(x => x.Type == ClaimTypes.Role).Value :"User";
}
System.IdentityModel.Claims
? - Camilo Terevinto请尝试以下操作:
var roles = user.Claims.Where(c => c.Type == ClaimTypes.Role).Select(x => x.Value).FirstOrDefault();
你也可以使用这样的语法:
var userClaims = User.Identity as System.Security.Claims.ClaimsIdentity;
var roles = userClaims.FindAll("http://schemas.microsoft.com/ws/2008/06/identity/claims/role").ToList();