我使用ASP.NET身份进行授权,在角色表中,我有以下角色:'角色1 ','角色2 ','角色3 ','角色4 ','角色5 ','角色n '。它可以是任何数字。
我的要求是具有任何角色的用户将能够访问该页面。
[Authorize(Roles = "Role 1", "Role 2")] // In this example, Number of roles
//are known. But in my case, number of roles is not known.
public ActionResult Index()
{
return View();
}
我有什么方法可以只搜索关键字"Role"
吗?与SQL "%Role%"
查询一样。
答案 0 :(得分:1)
AuthorizeAttribute
没有此功能,但您可以从中派生一个类并自行实现。
您可以使用此代码
public class CustomAuthorizeAttribute : AuthorizeAttribute
{
public string RolePattern { get; set; }
protected override bool AuthorizeCore(HttpContextBase httpContext)
{
if (!base.AuthorizeCore(httpContext))
{
return false;
}
IPrincipal user = httpContext.User;
if (!user.Identity.IsAuthenticated)
{
return false;
}
ClaimsIdentity claimsIdentity = (ClaimsIdentity)user.Identity;
string[] roles = claimsIdentity.FindAll(claimsIdentity.RoleClaimType).Select(claim => claim.Value).ToArray();
if (!string.IsNullOrEmpty(RolePattern) && !roles.Any(role => Regex.IsMatch(role, RolePattern)))
{
return false;
}
return true;
}
}
在您的操作上添加CustomAuthorize
[CustomAuthorize(RolePattern = "^[a-zA-Z0-9]*Role[a-zA-Z0-9]*$")]
public ActionResult Index()
{
return View();
}
答案 1 :(得分:0)
有一种方法。如果您想使用任何角色授权此操作,只需使用[Authorize]
而无需指定角色。
另一种方法是创建一个角色为常量的静态类。
例如:
public static class RoleConstants
{
public const string RoleOne = "Role 1";
/////the other roles here
}
在本课程之外,甚至在课堂内,您可以定义一个静态字符串,以包含您要在授权属性中使用的角色:
public static string ALLROLES = RoleOne + "," + //other roles;
在[Authorize]
属性中,您可以使用:
[Authorize(Roles = RoleConstants.ALLROLES)]
public ActionResult Index()
{
return View();
}
但在你的情况下,我会建议你使用我的第一个例子。只是[Authorize]
属性而没有指定角色。