动态向ASP.NET Core控制器添加授权

Fab*_*tti 1 authorization nuget-package asp.net-core

我有一个控制器,其中包含一些在许多内部项目中使用的实用程序方法。到目前为止,我一直在每个项目中复制源文件。现在,我想为此控制器创建一个NuGet包,以在内部存储库中使用。

问题出在这个控制器的授权上。我不想[Authorize()]在控制器类(或其动作)上放置特定的属性,因为授权应由使用该软件包的开发人员选择:在某些项目中,控制器可以被所有人使用,在某些项目中,可以使用只有经过身份验证的用户才能使用,其他用户则可以与自定义策略一起使用。

关于如何达到目的有什么想法?

Mét*_*ule 6

我将为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)