未实施自定义 AuthorizeAttribute
Custom AuthorizeAttribute not being implemented
在我们的 MVC 解决方案中,我们有两个 AuthorizeAttribute
的自定义实现 - 一个名为 BasicHttpAuthorizeAttribute
并已在生产中使用多年,另一个 RoleAuthorizeAttribute
最近才被使用已添加。
创建RoleAuthorizeAttribute
时我只是简单地复制了BasicHttpAuthorizeAttribute
并修改了一些already-overridden方法。
这两个属性都用于对用户进行身份验证,RoleAuthorizeAttribute
用于验证用户是否具有所需的角色。
但是,RoleAuthorizeAttribute
从不对用户进行身份验证。它根本没有被调用,而是当 non-logged-in 用户到达控制器操作并且代码请求上下文用户时,我们的 MVC 控制器抛出异常。
以下是此习俗的概要AuthorizeAttribute
。如果我在所有这些方法上放置断点,我发现在发出请求时会命中其中的 none。
谁能解释为什么这个 class 没有被用来验证用户身份?为什么未经身份验证的用户没有被重定向到登录页面,但如果我将 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)
{
// ...
}
}
}
我们使用基本身份验证,因此有一个 header 设置:
我见过 older questions asking about the same problem,但在那些情况下,它们还会覆盖一个 AuthorizeCore
方法,该方法似乎不再出现在 AuthorizeAttribute
class 上。
我自己弄明白了为什么会这样。
有两个 AuthorizeAttributes
- 一个在 System.Web.Http
命名空间中,另一个在 System.Web.Mvc
中。我没有意识到这一点,并试图构建一个通用的属性,所以我的属性 是 适用于 WebAPI 请求但不适用于 MVC 控制器请求。
这两个属性的区别在于 OnAuthorize
方法,它们各自采用不同的上下文参数。
一旦我构建了两个独立的属性(几乎相同),每个属性都派生自不同的 AuthorizeAttribute
,一切都按预期工作。
在我们的 MVC 解决方案中,我们有两个 AuthorizeAttribute
的自定义实现 - 一个名为 BasicHttpAuthorizeAttribute
并已在生产中使用多年,另一个 RoleAuthorizeAttribute
最近才被使用已添加。
创建RoleAuthorizeAttribute
时我只是简单地复制了BasicHttpAuthorizeAttribute
并修改了一些already-overridden方法。
这两个属性都用于对用户进行身份验证,RoleAuthorizeAttribute
用于验证用户是否具有所需的角色。
但是,RoleAuthorizeAttribute
从不对用户进行身份验证。它根本没有被调用,而是当 non-logged-in 用户到达控制器操作并且代码请求上下文用户时,我们的 MVC 控制器抛出异常。
以下是此习俗的概要AuthorizeAttribute
。如果我在所有这些方法上放置断点,我发现在发出请求时会命中其中的 none。
谁能解释为什么这个 class 没有被用来验证用户身份?为什么未经身份验证的用户没有被重定向到登录页面,但如果我将 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)
{
// ...
}
}
}
我们使用基本身份验证,因此有一个 header 设置:
我见过 older questions asking about the same problem,但在那些情况下,它们还会覆盖一个 AuthorizeCore
方法,该方法似乎不再出现在 AuthorizeAttribute
class 上。
我自己弄明白了为什么会这样。
有两个 AuthorizeAttributes
- 一个在 System.Web.Http
命名空间中,另一个在 System.Web.Mvc
中。我没有意识到这一点,并试图构建一个通用的属性,所以我的属性 是 适用于 WebAPI 请求但不适用于 MVC 控制器请求。
这两个属性的区别在于 OnAuthorize
方法,它们各自采用不同的上下文参数。
一旦我构建了两个独立的属性(几乎相同),每个属性都派生自不同的 AuthorizeAttribute
,一切都按预期工作。