在行动中评估 AuthorizeAttribute

Evaluate AuthorizeAttribute in action

可以使用 [Authorize] 属性授权操作。但是我只想在特定条件下对动作进行授权,所以我不能使用这个属性。我认为我无法使用 IAuthorizationService.AuthorizeAsync,因为我没有任何策略名称。这是我在 Startup 中的服务配置。

services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
            .AddMicrosoftIdentityWebApi(Configuration, "AzureAdB2C");

所以我的问题是,如何将 [Authorize] 评估移动到操作代码中?

AuthorizeAttribute 将(可能与其他)转换为 AuthorizeFilter 并且此过滤器将使用一些不等同于简单 IAuthorizationService.AuthorizeAsync 的代码执行。但是,如果您无论如何都想使用它,我们可以通过使用 IAuthorizationPolicyProvider.GetDefaultPolicyAsync 来获取默认策略([Authorize] 在没有指定任何策略的情况下使用它)。之后你可以授权User得到一个AuthorizationResult。如果 属性 Succeeded 为真,则成功。否则,您可以在 属性 FailureAuthorizationFailure 类型)中获得详细的失败信息。这是代码:

public class TestController {
     readonly IAuthorizationService _authorizationService;
     readonly IAuthorizationPolicyProvider _authorizationPolicyProvider;
     public TestController(IAuthorizationService authorizationService,
                           IAuthorizationPolicyProvider authorizationPolicyProvider){
         _authorizationService = authorizationService;
         _authorizationPolicyProvider = authorizationPolicyProvider;
     }

     public async Task<IActionResult> SomeAction(){
          var defaultPolicy = await _authorizationPolicyProvider.GetDefaultPolicyAsync();
          var authResult = await _authorizationService.AuthorizeAsync(User, defaultPolicy);
          if(authResult.Succeeded){
             //do something ...
          }
     }
}