【问题标题】:declarative resource based requirement authorization not working with API Controller基于声明性资源的需求授权不适用于 API 控制器
【发布时间】:2020-02-12 10:29:49
【问题描述】:

我正在尝试设置一个授权策略,我可以使用它来装饰 .net core 3.1 中 API 控制器中的操作。我一直在关注这些例子: https://docs.microsoft.com/en-us/aspnet/core/security/authorization/resourcebased?view=aspnetcore-3.1

如果我有一个像下面这样装饰的 API 操作,我的代码没有命中处理程序的 handlerequirementAsync 方法,并且我从 swagger 收到 403 Forbidden 响应。如果我从处理程序/需求中删除文档模型,它确实有效。我做错了什么还是 api 请求不支持?

这是其他相关代码:

    public class DocumentAuthorizationHandler : 
    AuthorizationHandler<SameAuthorRequirement, Document>
{
    protected override Task HandleRequirementAsync(AuthorizationHandlerContext context,
                                                   SameAuthorRequirement requirement,
                                                   Document resource)
    {
        if (context.User.Identity?.Name == resource.Author)
        {
            context.Succeed(requirement);
        }

        return Task.CompletedTask;
    }
}

public class SameAuthorRequirement : IAuthorizationRequirement { }


[Authorize(Policy = "EditPolicy")]
public async Task<FileResult> RetreiveFile([FromRoute]Document model)


 {
 }

services.AddAuthorization(options =>
{
    options.AddPolicy("EditPolicy", policy =>
        policy.Requirements.Add(new SameAuthorRequirement()));
});

services.AddSingleton<IAuthorizationHandler, DocumentAuthorizationHandler>();

【问题讨论】:

  • Startup.cs 中的配置是什么?如果您希望社区审查并调试代码,请出示可以重现问题的相关代码。这个github issuegithub.com/aspnet/AspNetCore.Docs/issues/14944可能有帮助,可以参考一下。
  • 您好,感谢您的反馈。我的代码完全反映了链接中 Microsoft 文档中基于资源的授权示例。为了清楚起见,我将代码放入问题中

标签: api asp.net-core declarative-authorization resource-based-authorization


【解决方案1】:

你应该在控制器构造函数中注入IAuthorizationService

public class AbcController : Controller
{
   private readonly IAuthorizationService _authorizationService;

   public AbcController(IAuthorizationService authorizationService)
   {
      _authorizationService = authorizationService;
   } 
   // No need to add this [Authorize(Policy = "EditPolicy")]
   public async Task<FileResult> RetreiveFile([FromRoute]Document model)
   {
      //add this below line which shall call the handler
       var authorizationResult = await _authorizationService.AuthorizeAsync(User, model, "EditPolicy"); 
   }

【讨论】:

    猜你喜欢
    • 2021-04-13
    • 2021-09-29
    • 2012-11-07
    • 2015-12-03
    • 2023-03-25
    • 2020-07-30
    • 2013-09-22
    • 2021-08-31
    • 1970-01-01
    相关资源
    最近更新 更多