在ASP.NET授权属性中按名称搜索

时间:2018-04-08 08:16:20

标签: asp.net .net asp.net-mvc authorization asp.net-identity

我使用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%"查询一样。

2 个答案:

答案 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]属性而没有指定角色。