Roles.GetRolesForUser 在自定义授权属性中不可用
Roles.GetRolesForUser unavailable in custom authorization attirbute
我正在尝试实现我自己的自定义属性,我必须像这样获取当前用户的所有角色:
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);
它说角色 属性 是一个字符串,它不包含方法 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");
}
AuthorizeAttribute
包含一个public string Roles { get; set; }
属性(参考documentation)所以你需要使用全限定名
var userRoles = System.Web.Security.Roles.GetRolesForUser(...
或者您可以为程序集名称创建一个别名
我正在尝试实现我自己的自定义属性,我必须像这样获取当前用户的所有角色:
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);
它说角色 属性 是一个字符串,它不包含方法 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");
}
AuthorizeAttribute
包含一个public string Roles { get; set; }
属性(参考documentation)所以你需要使用全限定名
var userRoles = System.Web.Security.Roles.GetRolesForUser(...
或者您可以为程序集名称创建一个别名