Пользовательский атрибут AuthorizeAttribute не реализован - PullRequest
1 голос
/ 23 апреля 2019

В нашем решении MVC у нас есть две пользовательские реализации AuthorizeAttribute - одна с именем BasicHttpAuthorizeAttribute и используется в производстве в течение многих лет, а другая RoleAuthorizeAttribute, которая была недавно добавлена.

При создании RoleAuthorizeAttribute я просто скопировал BasicHttpAuthorizeAttribute и изменил некоторые из уже переопределенных методов.

Оба атрибута служат для аутентификации пользователя, а RoleAuthorizeAttribute для проверки того, что пользователь имеет требуемую роль.

Однако RoleAuthorizeAttribute никогда не аутентифицирует пользователя. Он просто не вызывается, и вместо этого наши контроллеры MVC выдают исключение, когда незарегистрированный пользователь достигает действия контроллера и код запрашивает контекстного пользователя.

Ниже приведена схема для этого пользовательского AuthorizeAttribute. Если я поставлю точки останова на всех этих методах, я обнаружу, что ни один из них не будет достигнут при выполнении запроса.

Может кто-нибудь объяснить, почему этот класс не используется для аутентификации пользователей? Почему не прошедший проверку подлинности пользователь не перенаправляется на страницу входа, но если я поменяю RoleAuthorize на BasicHttpAuthorize или просто на базовую Authorize, тогда они перенаправляются ?

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = true, AllowMultiple = false)]    
public class RoleAuthorizeAttribute : System.Web.Http.AuthorizeAttribute
{
    /// <summary>
    /// Gets or sets the <see cref="Role"/> enumerations required for authorization.
    /// </summary>
    public Role[] RequiredRoles
    {
        get {...}
        set {...}
    }

    public bool RequireSsl { get; set; };

    public bool RequireAuthentication { get; set; }

    public RoleAuthorizeAttribute(params Role[] requiredRoles)
    {
        // ...
    }

    public override void OnAuthorization(System.Web.Http.Controllers.HttpActionContext actionContext)
    {
        // ...
    }

    protected override void HandleUnauthorizedRequest(System.Web.Http.Controllers.HttpActionContext actionContext)
    {
        // ...
    }

    private bool Authenticate(System.Web.Http.Controllers.HttpActionContext actionContext)
    {
        // ...
    }

    public static bool TryGetPrincipal(string authHeader, out IPrincipal principal)
    {
        // ...
    }

    public static bool TryGetAuthCookie(out IPrincipal principal)
    {
        // ...
    }

    private static string[] ParseAuthHeader(string authHeader)
    {
        // ...
    }

    private static bool TryGetPrincipal(string username, string password, out IPrincipal principal)
    {
        // ...
    }
}

А вот пример его использования:

namespace MyProject.Areas.Customer.Controllers
{
    [RoleAuthorize(Role.Customer, Role.CompanyAdmin)]
    public partial class OrderController : MyCustomController
    {
        private static readonly ILog Log = LogManager.GetLogger(typeof (OrderController));

        public ActionResult Index(int id)
        {
            // ...
        }
    }
}

Мы используем обычную аутентификацию, поэтому заголовок установлен следующим образом:

enter image description here

Я видел старые вопросы, в которых задавалась та же проблема , но в этих случаях они также переопределяли метод AuthorizeCore, который больше не присутствует в классе AuthorizeAttribute.

1 Ответ

4 голосов
/ 30 апреля 2019

Я сам понял, почему это происходит.

Есть два AuthorizeAttributes - один в пространстве имен System.Web.Http, а другой в System.Web.Mvc.Я не знал об этом и пытался создать атрибут one-size-fits-all, поэтому мой атрибут был , работающий для запросов WebAPI, но не для запросов контроллера MVC.

Разница в этих двух атрибутах заключается в методе OnAuthorize, где каждый из них принимает разные аргументы контекста.

После того, как я построил два отдельных атрибута (которые почти идентичны), каждый из которых был получен из различного AuthorizeAttribute,все работало как положено.

...