sam*_*cow 0 .net asp.net-web-api asp.net-core-webapi
我有一个用.net Core构建的新Web API,带有自定义授权过滤器。我需要绕过此过滤器进行少量操作,否则需要全局使用它。如何获取MyAuthFilter以兑现方法UserController.Post上的[Microsoft.AspNetCore.Authorization]属性?
授权过滤器:
public class MyAuthFilter : IAuthorizationFilter {
public void OnAuthorization(AuthorizationFilterContext context) {
//do some auth
}
}
Run Code Online (Sandbox Code Playgroud)
在Startup.cs中全局注册Auth过滤器:
public void ConfigureServices(IServiceCollection services) {
services.AddMvc(options => {
options.Filters.Add(new MyAuthFilter());
});
}
Run Code Online (Sandbox Code Playgroud)
用户控制器上的属性修饰:
[Route("api/[controller]")]
[Authorize] //only want anonymous on single action within controller
public class UserController {
[HttpPost("login")]
[AllowAnonymous] //this is not honored - MyAuthFilter.OnAuthorization is executed
public JObject Post([FromBody] JObject userLogin) {
}
}
Run Code Online (Sandbox Code Playgroud)
小智 6
对于任何关注 .Net (Core) 5.0 的人来说,这可以通过查看 ActionDescriptors EndpointMetaData 来完成。
if (context.ActionDescriptor.EndpointMetadata.OfType<AllowAnonymousAttribute>().Any())
return;
Run Code Online (Sandbox Code Playgroud)
内置AuthorizeFilter有以下几行:
// Allow Anonymous skips all authorization
if (context.Filters.Any(item => item is IAllowAnonymousFilter))
{
return;
}
Run Code Online (Sandbox Code Playgroud)
FWIW,当您为这些类型的事物构建自己的实现时,需要注意实现要考虑到它应有的一切。如果查看的源代码AuthorizeFilter,您会发现它确实做了很多,而您可能没有。通常,最好只是从内置实现中派生并根据需要重写,而不是尝试自己实现接口。
| 归档时间: |
|
| 查看次数: |
668 次 |
| 最近记录: |