如何创建不依赖于 ASP.NET Core 声明的自定义 Authorize 属性?

Posted

技术标签:

【中文标题】如何创建不依赖于 ASP.NET Core 声明的自定义 Authorize 属性?【英文标题】:How do I create a custom Authorize attribute that does not depend on claims in ASP.NET Core? 【发布时间】: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? 也不能说明问题,因为它取决于声明。

【问题讨论】:

另一种看待它的方式是,经过身份验证的用户被授予“无需在 URL 中传递 ID 即可访问端点”权限,即声明。 sticking to patterns that are familiar to people 有话要说。 【参考方案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 属性的方式进行操作... :)

以上是关于如何创建不依赖于 ASP.NET Core 声明的自定义 Authorize 属性?的主要内容,如果未能解决你的问题,请参考以下文章

ASP.NET Core Web 应用程序系列- 使用ASP.NET Core内置的IoC容器DI进行批量依赖注入

ASP.NET Core 5 - 如何拥有可选依赖项?

ASP.NET Core JWT 和声明

依赖反转原则DIP 与 使用了Repository的asp.net core 项目结构

ASP.NET Core Web 应用程序系列- 使用ASP.NET Core内置的IoC容器DI进行批量依赖注入(MVC当中应用)

Asp.net Core AutoFac根据程序集实现依赖注入