В нашем решении 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](https://i.stack.imgur.com/OSWhb.png)
Я видел старые вопросы, в которых задавалась та же проблема , но в этих случаях они также переопределяли метод AuthorizeCore
, который больше не присутствует в классе AuthorizeAttribute
.