在 ASP.NET Core 6 Web API 中,我尝试调用
AuthorizationHandler
函数。我想创建一个授权机制,首先使用 [Authorize] 标签对来自 AWS cognito 的用户进行身份验证 - 这部分正在工作。
之后,我想要自己的自定义授权机制。
我的问题是
AuthorizationHandler
函数没有被调用。
这是我的代码中的部分:
程序.cs
builder.Services.AddAuthorization(options =>
{
options.AddPolicy("ScreenAuthorizationPolicy", policy =>
{
policy.Requirements.Add(new ScreenAuthorizationRequirement());
});
});
builder.Services.AddSingleton<IAuthorizationHandler, ScreenAuthorizationHandler>();
.
.
app.UseAuthentication();
app.UseAuthorization();
app.MapControllers();
app.UseCors("*");
app.Run();
AuthorizationAttribute.cs
[AttributeUsage(AttributeTargets.Method | AttributeTargets.Class, AllowMultiple = false)]
public class ScreenAuthorizationAttribute : Attribute
{
public Screens ScreenID { get; }
public PermissionLevel PermissionLevel { get; }
public ScreenAuthorizationAttribute(Screens screenID, PermissionLevel permissionLevel)
{
ScreenID = screenID;
PermissionLevel = permissionLevel;
}
}
ScreenAuthorizationRequirement.cs
public class ScreenAuthorizationRequirement : IAuthorizationRequirement
{
}
ScreenAuthorizationHandler.cs
public class ScreenAuthorizationHandler : AuthorizationHandler<ScreenAuthorizationRequirement>
{
protected override Task HandleRequirementAsync(
AuthorizationHandlerContext context,
ScreenAuthorizationRequirement requirement)
{
context.Succeed(requirement);
return Task.CompletedTask;
}
}
这是我需要进入的功能。
在我的控制器中我正在写
[Route("api/[controller]/Endpoint")]
[Authorize]
[ScreenAuthorization(Screens.screen1, PermissionLevel.Read)]
public async Task<IActionResult> GetSomething()
感谢您的帮助
您可能会混淆两种授权策略的用法。
第一个: 策略授权
使用需求、需求处理程序和预配置的策略。
使用带有策略名称的
[Authorize]
属性将策略应用到控制器。例如:
[Authorize(Policy = "AtLeast21")]
public class AtLeast21Controller : Controller
{
public IActionResult Index() => View();
}
第二个: 自定义授权属性
派生自 AuthorizeAttribute,并使用自定义 IAuthorizationPolicyProvider 来控制如何提供授权策略。
您可以像其他授权属性一样将其应用于操作。例如:
[MinimumAgeAuthorize(10)]
public IActionResult RequiresMinimumAge10()