Защита и доступ к службе .NET core WebApi с использованием OAuth2

У меня есть работающая служба WebApi ядра Asp.NET, которую можно вызвать из основного приложения MVC ASP.NET. Служба вызывается с помощью созданной AutoRest оболочки. В настоящее время служба не имеет уровня безопасности, а веб-сайт защищен с помощью OAuth2.

Я добавил в сервис следующее:

public void ConfigureServices(IServiceCollection services)
    {
        // Add framework services.
        services.AddApplicationInsightsTelemetry(Configuration);

        services.AddMvc();

        // NEW Authorisation
        services.AddAuthorization(options =>
        {
            options.AddPolicy("ApiAccess", policy => policy.RequireClaim("email"));
        });

    }

Мой контроллер защищен так:

[Authorize(Policy = "ApiAccess")]
public class StatusController : Controller

Однако я получаю исключение «Неавторизованное», когда я вызываю оболочку AutoRest:

try
        {
            var service = new StatusAPI(new Uri("http://localhost:17237/"));
            ViewData["State"] = service.ApiStatusGet();
        }
        catch (Exception ex)
        {
            ViewData["State"] = new[] { new ServiceStatus { Name = "Health API", Message = "Is unreachable " + ex.Message } };
        }

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


person Mark    schedule 31.08.2016    source источник
comment
Существует ли промежуточное программное обеспечение для проверки подлинности или какой-либо пользовательский код, который заполняет требование электронной почты в принципале?   -  person ycrumeyrolle    schedule 01.09.2016
comment
В идеале я ищу пример, показывающий, как все должно быть настроено   -  person Mark    schedule 02.09.2016
comment
Я не вижу, чтобы вы предоставляли какой-либо токен, который содержал бы утверждение электронной почты. Об этом позаботится StatusAPI?   -  person Cloud SME    schedule 02.09.2016


Ответы (2)


Попробуйте указать значение претензии, например разрешенный адрес электронной почты. Как предложено здесь - https://docs.asp.net/en/latest/security/authorization/claims.html

Повторил код

options.AddPolicy("Founders", policy => policy.RequireClaim("EmployeeNumber", "1", "2", "3", "4", "5"));

person lazy    schedule 31.08.2016
comment
Насколько я знаю, это просто ограничивает действительную ценность требований, и, насколько я могу судить, у меня нет никаких требований, поступающих через - person Mark; 31.08.2016

Авторизация не может быть выполнена без аутентификации. Сначала вам нужно аутентифицировать пользователя, а затем смотреть на его личность для предоставления доступа.

Если у вас есть JWT, предоставленный вашей AS OAuth2, вы можете использовать промежуточное ПО аутентификации JWT.

public void ConfigureServices(IServiceCollection services)
{
  // add the authentication dependencies
  services.AddAuthentication();
}

public void Configure(IApplicationBuilder app)
{
  app.UseJwtBearerAuthentication(new JwtBearerOptions
  {
     // configure your JWT authentication here
  });
}

Конечно, JWT должен содержать утверждение «электронная почта».

Вы можете посмотреть пример ASPNET Core: https://github.com/aspnet/Security/blob/dev/samples/JwtBearerSample/Startup.cs#L67

person ycrumeyrolle    schedule 03.09.2016