为 ASP.NET 核心控制器动态添加授权
Dynamically add authorization to ASP.NET Core controller
我有一个控制器,其中包含我在许多内部项目中使用的一些实用方法。直到现在我总是在每个项目中复制源文件。
现在我想为此控制器创建一个 NuGet 包以在内部存储库中使用。
问题出在这个控制器的授权上。我不想在控制器 class(或其操作)上放置特定的 [Authorize()]
属性,因为授权应该由使用该包的开发人员选择:在某些项目中,可以使用控制器每个人,在某些项目中只能由经过身份验证的用户使用,在其他项目中可以与自定义策略一起使用。
有什么实现目标的想法吗?
我将添加带有强制策略的 Authorize
属性,您的所有用户都必须执行该策略。像这样:
[Authorise(Policy = "MyLibPolicy")]
public class LibController : Controller
{
}
然后,根据他们的需要,他们可以在他们的 Configure
方法中进行不同的声明:
如果他们需要经过身份验证的用户:
services.AddAuthorization(options =>
{
options.AddPolicy("MyLibPolicy", policy =>
{
policy.RequireAuthenticatedUser();
});
});
如果他们需要自定义策略:
services.AddAuthorization(options =>
{
options.AddPolicy("MyLibPolicy", policy =>
{
policy.RequireAuthenticatedUser();
policy.RequireRole("SomeRole");
// other requirements
});
});
如果他们想要匿名访问:
现在,这是棘手的部分,因为您不能创建空策略(策略至少需要一个要求)。
但是,您可以创建自己的自定义要求(在您的 Nuget 包中)以允许匿名用户(基本上,一个总是成功的要求)。
public class AllowAnonymousAuthorizationRequirement : AuthorizationHandler<IAuthorizationRequirement>, IAuthorizationRequirement
{
protected override Task HandleRequirementAsync(AuthorizationHandlerContext context, IAuthorizationRequirement requirement)
{
context.Succeed(requirement);
return Task.CompletedTask;
}
}
然后,您的用户需要在使用前注册它,如下所示:
services.AddScoped<IAuthorizationHandler, AllowAnonymousAuthorizationRequirement>();
services.AddAuthorization(options =>
{
options.AddPolicy("MyLibPolicy", policy =>
{
policy.AddRequirements(new AllowAnonymousAuthorizationRequirement());
});
});
我有一个控制器,其中包含我在许多内部项目中使用的一些实用方法。直到现在我总是在每个项目中复制源文件。 现在我想为此控制器创建一个 NuGet 包以在内部存储库中使用。
问题出在这个控制器的授权上。我不想在控制器 class(或其操作)上放置特定的 [Authorize()]
属性,因为授权应该由使用该包的开发人员选择:在某些项目中,可以使用控制器每个人,在某些项目中只能由经过身份验证的用户使用,在其他项目中可以与自定义策略一起使用。
有什么实现目标的想法吗?
我将添加带有强制策略的 Authorize
属性,您的所有用户都必须执行该策略。像这样:
[Authorise(Policy = "MyLibPolicy")]
public class LibController : Controller
{
}
然后,根据他们的需要,他们可以在他们的 Configure
方法中进行不同的声明:
如果他们需要经过身份验证的用户:
services.AddAuthorization(options =>
{
options.AddPolicy("MyLibPolicy", policy =>
{
policy.RequireAuthenticatedUser();
});
});
如果他们需要自定义策略:
services.AddAuthorization(options =>
{
options.AddPolicy("MyLibPolicy", policy =>
{
policy.RequireAuthenticatedUser();
policy.RequireRole("SomeRole");
// other requirements
});
});
如果他们想要匿名访问:
现在,这是棘手的部分,因为您不能创建空策略(策略至少需要一个要求)。
但是,您可以创建自己的自定义要求(在您的 Nuget 包中)以允许匿名用户(基本上,一个总是成功的要求)。
public class AllowAnonymousAuthorizationRequirement : AuthorizationHandler<IAuthorizationRequirement>, IAuthorizationRequirement
{
protected override Task HandleRequirementAsync(AuthorizationHandlerContext context, IAuthorizationRequirement requirement)
{
context.Succeed(requirement);
return Task.CompletedTask;
}
}
然后,您的用户需要在使用前注册它,如下所示:
services.AddScoped<IAuthorizationHandler, AllowAnonymousAuthorizationRequirement>();
services.AddAuthorization(options =>
{
options.AddPolicy("MyLibPolicy", policy =>
{
policy.AddRequirements(new AllowAnonymousAuthorizationRequirement());
});
});