Roles.GetRolesForUser 在自定义授权属性中不可用

Posted

技术标签:

【中文标题】Roles.GetRolesForUser 在自定义授权属性中不可用【英文标题】:Roles.GetRolesForUser unavailable in custom authorization attirbute 【发布时间】:2017-12-31 05:50:21 【问题描述】:

我正在尝试实现我自己的自定义属性,我必须像这样获取当前用户的所有角色:

public class CustomRoleAuthorization: System.Web.Mvc.AuthorizeAttribute
    

   public override void OnAuthorization(AuthorizationContext filterContext)
        
            base.OnAuthorization(filterContext);
            if (!filterContext.HttpContext.User.Identity.IsAuthenticated)
            
                filterContext.Result = new RedirectResult("~/Login");
                return;
            
            var requiredRoles = Roles.Split(Convert.ToChar(",")).ToList();

            var userRoles = Roles.GetRolesForUser(filterContext.HttpContext.User.Identity.Name);

            foreach (var item in requiredRoles)
            
                if (!filterContext.HttpContext.User.IsInRole(item))
                
                    filterContext.Result = new RedirectResult("~/Index/Index");
                    return;
                
            

        

但由于某种原因,这条线不起作用:

 var userRoles = Roles.GetRolesForUser(filterContext.HttpContext.User.Identity.Name);

它说 Roles 属性是一个字符串并且它不包含 GetRolesForUser 方法?

如何将此扩展方法添加到我的项目中,以便我可以在登录时从身份中获取所有用户角色??

@Stephen 这是我在登录时设置角色的方式:

 if (user.PasswordHash == PasswordSecurity.CreatePasswordHash(model.Password, user.PasswordSalt))
 
  ClaimsIdentity identity = new ClaimsIdentity(DefaultAuthenticationTypes.ApplicationCookie);
 identity.AddClaim(new Claim(ClaimTypes.NameIdentifier, model.Email));
  List<Claim> claims = new List<Claim>();
 var roles = user.UserRoles.Where(x=>x.Active==true).ToList();
 foreach (var item in roles)
 
   claims.Add(new Claim(ClaimTypes.Role, item.Roles.RoleName));
  
 identity.AddClaims(claims);
 identity.AddClaim(new Claim(ClaimTypes.Name, model.Email));
 AuthenticationManager.SignIn(new AuthenticationProperties  IsPersistent = true, ExpiresUtc = DateTimeOffset.UtcNow.AddHours(3) , identity);
 return Json("ok");
 

【问题讨论】:

【参考方案1】:

AuthorizeAttribute 包含一个public string Roles get; set; 属性(参考documentation),因此您需要使用完全限定名称

var userRoles = System.Web.Security.Roles.GetRolesForUser(...

或者您可以为程序集名称创建别名

【讨论】:

嘿斯蒂芬,非常感谢您的回复!顺便说一句,我做了你刚刚写的,结果我得到:string[0]?看起来我没有正确设置角色或......? 这表明您没有当前登录用户的角色(但不确定是否有其他原因可能会返回空数组。 我已经编辑了我如何添加用户角色的问题 您使用ClaimsIdentity,我认为获取所有角色有不同的代码(给我10分钟检查) 查看asp.net identity get all roles of logged in user的答案

以上是关于Roles.GetRolesForUser 在自定义授权属性中不可用的主要内容,如果未能解决你的问题,请参考以下文章

Roles.GetRolesForUser 抛出异常对象引用未设置为对象的实例

Roles.GetRolesForUser 在自定义授权属性中不可用

Roles.AddUsersToRoles() 要求 IDENTITY_INSERT 为 ON

如何在 _LoginPartial 的代码部分中获取用户角色?

在超集中构建自定义马条形图并添加自定义项以自定义图表

在 Android 中自定义通知区域