ASP.NET Core 中如何通过 AuthorizeAttribute 做自定义验证?

Posted dotNET跨平台

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ASP.NET Core 中如何通过 AuthorizeAttribute 做自定义验证?相关的知识,希望对你有一定的参考价值。

咨询区

  • jltrem

我想在 ASP.NET Core 中用 authorization 特性实现一个自定义验证,在之前的版本中,我可以用系统提供的 bool AuthorizeCore(HttpContextBase httpContext) 方法,但在这个版本中已经没有该方法了。

请问当前我该如何实现这个自定义的 AuthorizeAttribute 呢?

回答区

  • gius

看样子你用的是 ASP.NET Core 2,当然现在你也可以实现,继承 AuthorizeAttribute 并实现 IAuthorizationFilter 接口即可,参考代码如下:

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = true, Inherited = true)]
public class CustomAuthorizeAttribute : AuthorizeAttribute, IAuthorizationFilter
{
    private readonly string _someFilterParameter;

    public CustomAuthorizeAttribute(string someFilterParameter)
    {
        _someFilterParameter = someFilterParameter;
    }

    public void OnAuthorization(AuthorizationFilterContext context)
    {
        var user = context.HttpContext.User;

        if (!user.Identity.IsAuthenticated)
        {
            // it isn't needed to set unauthorized result 
            // as the base class already requires the user to be authenticated
            // this also makes redirect to a login page work properly
            // context.Result = new UnauthorizedResult();
            return;
        }

        // you can also use registered services
        var someService = context.HttpContext.RequestServices.GetService<ISomeService>();

        var isAuthorized = someService.IsUserAuthorized(user.Identity.Name, _someFilterParameter);
        if (!isAuthorized)
        {
            context.Result = new StatusCodeResult((int)System.Net.HttpStatusCode.Forbidden);
            return;
        }
    }
}
  • Kévin Chalet

对于纯碎的授权,比如说只能给某些用户一些特定的访问权限,现在推荐的做法是使用新的授权块。

public class Startup
{
    public void ConfigureServices(IServiceCollection services)
    {
        services.Configure<AuthorizationOptions>(options =>
        {
            options.AddPolicy("ManageStore", policy => policy.RequireClaim("Action", "ManageStore"));
        });
    }
}

public class StoreController : Controller
{
    [Authorize(Policy = "ManageStore"), HttpGet]
    public async Task<IActionResult> Manage() { ... }
}

对于授权,最好在中间件层面做处理,回过头来说,你确定现在的做法是正确的吗?

点评区

确实在 ASP.NET Core 5 时代,更好的方式应该是用 中间件 实现,而不是深入到业务体之后再用过滤器的方式来实现,当然你也可以用过滤器。

以上是关于ASP.NET Core 中如何通过 AuthorizeAttribute 做自定义验证?的主要内容,如果未能解决你的问题,请参考以下文章

如何通过 Asp.Net Core 中间件的 JsonResult 响应?

如何使用 MS 数据库(ASP.NET Core MVC)通过表格显示信息?

如何在 ASP.Net Core 使用 内存缓存

如何在 asp.net core 中编写自定义 actionResult

如何通过 ASP.NET Core 3 中的中间 Web API 传递未更改的 HTTP 响应?

如何在 ASP.NET Core Web API 中添加两个不同的令牌