gpt4 book ai didi

c# - 未实现自定义 AuthorizeAttribute

转载 作者:太空宇宙 更新时间:2023-11-03 20:50:32 27 4
gpt4 key购买 nike

在我们的 MVC 解决方案中,我们有两个 AuthorizeAttribute 的自定义实现 - 一个名为 BasicHttpAuthorizeAttribute 并已在生产中使用多年,另一个 RoleAuthorizeAttribute,这是最近添加的。

在创建 RoleAuthorizeAttribute 时,我只是复制了 BasicHttpAuthorizeAttribute 并修改了一些已经覆盖的方法。

这两个属性都用于对用户进行身份验证,RoleAuthorizeAttribute 用于验证用户是否具有所需的角色。

但是,RoleAuthorizeAttribute 从不对用户进行身份验证。它根本没有被调用,相反,当未登录的用户到达 Controller 操作并且代码请求上下文用户时,我们的 MVC Controller 会抛出异常。

下面是这个自定义 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)
{
// ...
}
}
}

我们使用基本身份验证,因此有一个 header 集:

enter image description here

我看过 older questions asking about the same problem ,但在这些情况下,它们还会覆盖 AuthorizeCore 方法,该方法似乎不再存在于 AuthorizeAttribute 类中。

最佳答案

我自己弄明白了为什么会这样。

有两个 AuthorizeAttributes - 一个在 System.Web.Http 命名空间中,另一个在 System.Web.Mvc 中。我没有意识到这一点,并试图构建一个通用的属性,所以我的属性适用于 WebAPI 请求,但不适用于 MVC Controller 请求。

这两个属性的区别在于 OnAuthorize 方法,它们各自采用不同的上下文参数。

一旦我构建了两个独立的属性(几乎相同),每个属性都派生自不同的 AuthorizeAttribute,一切都按预期工作。

关于c# - 未实现自定义 AuthorizeAttribute,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55809715/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com