Поиск по имени в атрибуте авторизации ASP.NET

avatar
Usman Khalid
8 апреля 2018 в 08:16
97
2
1

Я использую ASP.NET Identity для авторизации. В таблице ролей у меня есть такие роли, как: 'Роль 1','Роль 2','<499156903Роль 3','Роль 4','Роль 5','Роль n'39575>'39575>'39575> Это могут быть любые числа.

Мое требование состоит в том, что пользователь с любой из ролей сможет получить доступ к странице.

[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%".

Источник
karthickj25
8 апреля 2018 в 08:34
1

Я не совсем понял, вы хотите разрешить доступ ко всем ролям?

Ответы (2)

avatar
Kahbazi
8 апреля 2018 в 09:05
2

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();
}
avatar
Abed Ghaffer
8 апреля 2018 в 08:47
0

Есть способ. Если вы хотите авторизовать это действие с какой-либо ролью, вы можете просто использовать [Authorize] без указания ролей.

Другой способ — создать статический класс с ролями как константами.

Например:

public static class RoleConstants
{
     public const string RoleOne = "Role 1";
     /////the other roles here
}

И вне этого класса или даже внутри класса вы можете определить статическую строку, чтобы включить роли, которые вы хотите использовать в атрибуте Authorize:

public static string ALLROLES = RoleOne + "," + //other roles;

И в вашем атрибуте [Authorize] вы можете использовать:

[Authorize(Roles = RoleConstants.ALLROLES)]
public ActionResult Index()
{
    return View();
}

Но в вашей ситуации я бы порекомендовал вам использовать мой первый пример. Просто атрибут [Authorize] без указания ролей.