ASP.NET Core 2.0 Как получить доступ к UserManager в политике? - PullRequest
0 голосов
/ 04 декабря 2018

У меня есть этот класс требований, которому нужен доступ к usermanager

public class NoAdminRequirment : IAuthorizationRequirement
{
    bool NoAdmins { get; set; }
    private readonly UserManager<IdentityUser> userManager;

    public NoAdminRequirment(UserManager<IdentityUser> userManager)
    {
        this.userManager = userManager;
            NoAdmins = userManager.GetUsersInRoleAsync("administrators").Result.Count() == 0;
    }
}

Насколько я понимаю, usermanager инициализируется автоматически путем внедрения зависимостей, так как он настроен в моем приложении

Ну, это не очень полезно, так как мне нужно передать usermanager в политику сейчас

services.AddAuthorization(option =>
{
    option.AddPolicy("NoAdmins", policy => policy.Requirements.Add(new { /*???*/ }));
});

Может кто-нибудь предложить альтернативу или способ доступа к usermanager?

Ответы [ 2 ]

0 голосов
/ 04 декабря 2018

Я думаю, что это должно сработать:

public class ExcludeRoleRequirement : IAuthorizationRequirement
{
  public string Role { get; private set; }

  public ExcludeRoleRequirement(string role)
  {
    Role = role;
  }
}

Так как ExcludeRoleHandler зарегистрирован в контейнере DI, и я предполагаю, что UserManager также зарегистрирован, вы можете добавить UserManager в конструктор

public class ExcludeRoleHandler : AuthorizationHandler<ExcludeRoleRequirement>
{
  private readonly UserManager<IdentityUser> _manager;
  public ExcludeRoleHandler(UserManager<IdentityUser> manager)
  {
    _manager = manager;
  }
  protected override async Task HandleRequirementAsync(AuthorizationHandlerContext context, 
    ExcludeRoleRequirement requirement)
  {
    var usersInRole = await _manager.GetUsersInRoleAsync(requirement.Role);
    if (!usersInRole.Any())
    {
      context.Succeed(requirement);
    }

    return Task.CompletedTask;
  }
}

Затем в Startup.cs:

services.AddAuthorization(option => {
  options.AddPolicy("NoAdmin", policy =>
    policy.Requirements.Add(new ExcludeRoleRequirement("administrators")));  
});


services.AddSingleton<IAuthorizationHandler, ExcludeRoleHandler>();

Надеюсь, это поможет

РЕДАКТИРОВАТЬ: я забыл добавить

[Authorize(Policy = "NoAdmin")]
public class NotForAdminController : ControllerBase
{
}
0 голосов
/ 04 декабря 2018
services.AddAuthorization(option => {
    option.AddPolicy("NoAdmins", policy => 
                policy.Requirements.Add(services.BuildServiceProvider().GetService<NoAdminRequirment>()));
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...