авторизация на основе политик aspnet core 2.0 продолжает возвращаться 403 - PullRequest
0 голосов
/ 03 января 2019

Я пытаюсь реализовать схему проверки подлинности на основе политики с использованием проверки подлинности Windows и пользовательских утверждений.Все компилируется и работает нормально, но авторизация не проходит по неизвестным причинам.Вот что я делаю:

1 - в файле startup.cs мы добавляем аутентификацию Windows в качестве схемы аутентификации, добавляем политику «BASIC_USER», требующую утверждения «BASIC_USER», и вводим преобразователь утверждений.

public void ConfigureServices(IServiceCollection services)
{

  services.AddMvc();

  services.AddTransient<IClaimsTransformation, ClaimsTransformer>();

  services.AddAuthentication(IISDefaults.AuthenticationScheme);

  services.AddAuthorization(options =>
  {
    options.AddPolicy("BASIC_USER", policy => policy.RequireClaim("BASIC_USER"));
  });

}

2 - наш преобразователь утверждений добавляет требование к ClaimsPrincipal при каждом запросе.(Обычно это добавляет заявки на основе ролей, управляемых данными, но редактируется для краткости.)

public async Task<ClaimsPrincipal> TransformAsync(ClaimsPrincipal principal)
{

    Claim claim = new Claim(ClaimTypes.Role, "BASIC_USER");

    ((ClaimsIdentity)principal.Identity)
        .AddClaim(claim);

    return await Task.FromResult(principal);

  }

}

3 - Мы украшаем наш контроллер атрибутом Authorize:

  public class MyController : Controller
  {

    [Authorize(Policy = "BASIC_USER")]
    public async Task<ActionResult> Get()
    {
      ...
    }
  }

Когда я шаг #1 и # 2 выше, кажется, все в порядке - политика добавляется при запуске, и требование добавляется по запросу, но все равно контроллер возвращает правильно сформированный 403. Есть ли способ отладки процесса авторизации или яздесь что-то упущено?

1 Ответ

0 голосов
/ 04 января 2019

Это оказалось вызвано небольшим недосмотром.Эта строка:

options.AddPolicy("BASIC_USER", policy => policy.RequireClaim("BASIC_USER"));

На самом деле должна читаться:

options.AddPolicy("BASIC_USER", policy => policy.RequireClaim(ClaimTypes.Role, "BASIC_USER"));

Тип заявки должен совпадать с тем, который добавляется к принципалу в TransformAsync.

...