Fab*_*tti 1 authorization nuget-package asp.net-core
我有一个控制器,其中包含一些在许多内部项目中使用的实用程序方法。到目前为止,我一直在每个项目中复制源文件。现在,我想为此控制器创建一个NuGet包,以在内部存储库中使用。
问题出在这个控制器的授权上。我不想[Authorize()]在控制器类(或其动作)上放置特定的属性,因为授权应由使用该软件包的开发人员选择:在某些项目中,控制器可以被所有人使用,在某些项目中,可以使用只有经过身份验证的用户才能使用,其他用户则可以与自定义策略一起使用。
关于如何达到目的有什么想法?
我将为Authorize所有用户必须实施的强制策略添加属性。像这样:
[Authorise(Policy = "MyLibPolicy")]
public class LibController : Controller
{
}
Run Code Online (Sandbox Code Playgroud)
然后,根据他们的需求,他们可以在他们的Configure方法中以不同的方式声明它:
如果他们需要经过身份验证的用户:
services.AddAuthorization(options =>
{
options.AddPolicy("MyLibPolicy", policy =>
{
policy.RequireAuthenticatedUser();
});
});
Run Code Online (Sandbox Code Playgroud)
如果他们需要自定义策略:
services.AddAuthorization(options =>
{
options.AddPolicy("MyLibPolicy", policy =>
{
policy.RequireAuthenticatedUser();
policy.RequireRole("SomeRole");
// other requirements
});
});
Run Code Online (Sandbox Code Playgroud)
如果他们想要匿名访问:
现在,这是棘手的部分,因为您不能创建一个空策略(一个策略至少需要一个需求)。
但是,您可以创建自己的自定义要求(在您的Nuget包中)以允许匿名用户(基本上是始终成功的要求)。
public class AllowAnonymousAuthorizationRequirement : AuthorizationHandler<IAuthorizationRequirement>, IAuthorizationRequirement
{
protected override Task HandleRequirementAsync(AuthorizationHandlerContext context, IAuthorizationRequirement requirement)
{
context.Succeed(requirement);
return Task.CompletedTask;
}
}
Run Code Online (Sandbox Code Playgroud)
然后,您的用户将需要在使用它之前注册它,如下所示:
services.AddScoped<IAuthorizationHandler, AllowAnonymousAuthorizationRequirement>();
services.AddAuthorization(options =>
{
options.AddPolicy("MyLibPolicy", policy =>
{
policy.AddRequirements(new AllowAnonymousAuthorizationRequirement());
});
});
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
559 次 |
| 最近记录: |