0

У нас есть эта настраиваемая схема авторизации, которую я пытаюсь решить, с возможностью модульного тестирования и использования инъекции зависимостей в ядре .NET. Позвольте мне объяснить настройки:Интенсивность зависимостей в зависимости от пользовательской авторизации .NET Core

Я создал интерфейс IStsHttpClient и класс StsHttpClient. Этот класс подключается к внутренней веб-службе, которая создает маркеры &. Это имеет ровно один метод «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 
{ 

} 

Handler:

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

Я в конечном итоге реализовать один или два дня после этого, что я могу использовать Middleware делать именно то, что я хотеть. –

 Смежные вопросы

  • Нет связанных вопросов^_^