【问题标题】:How do I create a custom Authorize attribute that does not depend on claims in ASP.NET Core?如何创建不依赖于 ASP.NET Core 声明的自定义 Authorize 属性?
【发布时间】:2020-06-15 14:28:04
【问题描述】:

我想创建一个执行以下操作的自定义 AuthorizeAttribute:

  • 如果请求的URL包含查询参数id,则需要正常授权
  • 如果请求的网址包含查询参数id,则不需要授权

阅读https://docs.microsoft.com/en-us/aspnet/core/security/authorization/iauthorizationpolicyprovider?view=aspnetcore-3.1 在这种特殊情况下并不能说明问题。

阅读How do you create a custom AuthorizeAttribute in ASP.NET Core? 也不能说明问题,因为它取决于声明。

【问题讨论】:

标签: c# asp.net-core


【解决方案1】:

您可以简单地创建Authorization Filter

public class CustomAuthorizationFilter : IAuthorizationFilter
    {
        public void OnAuthorization(AuthorizationFilterContext context)
        {
            string id = context.HttpContext.Request.Query["id"]?.ToString();

            if (!string.IsNullOrEmpty(id))
            {
                // Authorization logic
            }
        }
    }

【讨论】:

  • 在 AuthorizeAttribute 中,如果未经授权,用户将被重定向到登录。是否可以在 IAuthorizationFilter 中实现相同的行为?我的意思是不对重定向 url 进行硬编码(AuthorizeAttribute 会自动计算出来)。
  • 你的意思是登录成功后会重定向到之前的请求url?
  • 不,我的意思是在登录之前。如上述属性示例;如果事实证明用户没有被授权,我需要重定向到登录页面(根据 ConfigureServices,例如 services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme).AddCookie(o => o.LoginPath = "/login"))。 Authorize 属性似乎会自动执行此操作。当然,我可以手动返回重定向并复制登录路径字符串,但如果可以按照 Authorize 属性的方式进行操作... :)
猜你喜欢
  • 2017-03-31
  • 1970-01-01
  • 2023-01-09
  • 1970-01-01
  • 2011-09-09
  • 2022-06-30
  • 1970-01-01
  • 2020-09-06
  • 1970-01-01
相关资源
最近更新 更多