0

我们有这个自定义的授权方案,我试图解决的能力,单元测试和在.NET核心中使用依赖注入。让我解释一下设置:.NET核心自定义授权依赖注入

我创建了一个接口IStsHttpClient和类StsHttpClient。此类连接到创建&解码令牌的内部Web服务。这有一个方法“DecodeToken(字符串标记)”,构造函数非常简单 - 它需要一个从DI加载的选项对象。

然后,我的AuthorizationHandler理论上会使用IStsHttpClient调用和解码令牌。我的问题是,基于在线示例,我不知道如何正确指定/构建授权处理程序(请参阅下面的代码)。

授权码在这里:

public class MyAuthorizationRequirement : AuthorizationHandler<MyAuthorizationRequirement >, IAuthorizationRequirement 
{ 
    const string Bearer = "Bearer "; 
    readonly IStsHttpClient _client; 

    public BuzzStsAuthorizationRequirement([FromServices]IStsHttpClient client) 
    { 
     _client = client;   
    } 

    protected override async Task HandleRequirementAsync(AuthorizationHandlerContext context, MyStsAuthorizationRequirement requirement) 
    { 
     /* remaining code omitted - but this will call IStsHttpClient.Decode() */ 

我Startup.cs

public void ConfigureServices(IServiceCollection services) 
    { 
     services.Configure<StsHttpOptions>(Configuration.GetSection("StsConfigurationInfo")); 
     services.AddScoped<IStsHttpClient , StsHttpClient >(); 
     services.AddAuthorization(options => 
     { 
      options.AddPolicy("Authorize", policy => 
      { 
       /* initialize this differently?? */ 
       policy.AddRequirements(new MyStsAuthorizationRequirement(/* somethign is needed here?? */)); 
      }); 
     }); 

回答

1

尼古拉斯,

你有你的处理程序和要求在这里分开。除此之外,你的DI的东西在处理程序。需求本身将是一个DTO或具有标记接口IAuthorizationRequirement的空类。

要求:

public class MyAuthorizationRequirement : IAuthorizationRequirement 
{ 

} 

处理程序:

public class MyAuthorizationHandler : AuthorizationHandler<MyAuthorizationRequirement> 
{ 
    const string Bearer = "Bearer "; 
    readonly IStsHttpClient _client; 

    public BuzzStsAuthorizationRequirement([FromServices]IStsHttpClient client) 
    { 
     _client = client;   
    } 

    protected override async Task HandleRequirementAsync(AuthorizationHandlerContext context, MyAuthorizationRequirement requirement) 
    { 
    ... 
    } 
} 

配置:

services.Configure<StsHttpOptions>(Configuration.GetSection("StsConfigurationInfo")); 
     services.AddScoped<IStsHttpClient , StsHttpClient >(); 
     services.AddAuthorization(options => 
     { 
      options.AddPolicy("Authorize", policy => 
      {    
       policy.AddRequirements(new MyAuthorizationRequirement()); 
      }); 
     }); 
+0

我最终实现了两天之后这个,我可以使用中间件做什么我想。 –

相关问题