Asp.Net MVC 5 - Custom Authorize не работает? - PullRequest
0 голосов
/ 03 июля 2018

У меня есть следующий контроллер с пользовательским атрибутом авторизации:

[CustomAuthorize(Roles = "Editor, Admin")]
public ActionResult Test()
{
       //...

}

Вот мой код авторизации:

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method)]
public class CustomAuthorizeAttribute : AuthorizeAttribute
{

    private readonly string[] _allowedRoles;

    public CustomAuthorizeAttribute(params string[] roles)
    {
        _allowedRoles = roles;

    }

    protected override bool AuthorizeCore(HttpContextBase httpContext)
    {
        if (httpContext == null)
            throw new ArgumentNullException("httpContext");


        var user = httpContext.User;

        if (!user.Identity.IsAuthenticated)
        {
            return false;
        }

        if (_allowedRoles.Length > 0 && !_allowedRoles.Any(user.IsInRole))
        {
            return false;
        }


        return true;

    }


}

Пользовательская авторизация возвращает true для даже пользователя, который не является редактором или администратором ?

Я думаю, проблема в следующем:

[CustomAuthorize(Roles = "Editor, Admin")]

Я передаю его в виде строки, и мне нужно преобразовать его в массив в моем методе CustomAuthorize ???

Ответы [ 2 ]

0 голосов
/ 03 июля 2018

Текущее определение атрибута не ссылается на свойство Roles, а также не заполняет поле _allowedRoles.

Вот почему ваш атрибут всегда возвращает true.

Просмотрите логическую схему настраиваемого атрибута

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method)]
public class CustomAuthorizeAttribute : System.Web.Mvc.AuthorizeAttribute {
    private readonly string[] _allowedRoles;

    public CustomAuthorizeAttribute(params string[] roles) {
        _allowedRoles = roles;
    }

    protected override bool AuthorizeCore(HttpContextBase httpContext) {
        if (httpContext == null)
            throw new ArgumentNullException("httpContext");

        var user = httpContext.User;
        if (user?.Identity?.IsAuthenticated) {
            if (isInRole(user, _allowedRoles)) {
                return true;
            }
            if (!string.IsNullOrWhiteSpace(Roles)) {
                var roles = Roles.Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries);
                if (isInRole(user, roles))
                    return true;
            }
            return true;
        }
        return false;
    }

    bool isInRole(IPrincipal user, string[] roles) {
        return roles.Length > 0 && roles.Any(user.IsInRole);
    }
}

Который можно использовать как

[CustomAuthorize(Roles = "Editor, Admin")]
public ActionResult Test() {
       //...
}

где роли будут разделены и проверены на пользователя

Или как

[CustomAuthorize("Editor", "Admin")]
public ActionResult Test() {
       //...
}

, который заполнил бы конструктор атрибута массивом параметров

0 голосов
/ 03 июля 2018

сначала вам нужно получить роли текущего пользователя, а затем проверить, разрешает ли какая-либо из ролей пользователю доступ к контроллеру:

protected override bool AuthorizeCore(HttpContextBase httpContext)
{
    if (httpContext == null)
        throw new ArgumentNullException("httpContext");


    var user = httpContext.User;

    if (!user.Identity.IsAuthenticated)
    {
        return false;
    }

    var userRoles = ((ClaimsIdentity)User.Identity).Claims
            .Where(c => c.Type == ClaimTypes.Role)
            .Select(c => c.Value);

    if (_allowedRoles.Length > 0 && !_allowedRoles.Any(x => userRoles.Any(y => x.Equals(y)))))
    {
        return false;
    }


    return true;

}
...