Специфичные для области схемы аутентификации в ASP.NET Core - PullRequest
0 голосов
/ 24 января 2019

У меня есть приложение ASP.NET Core MVC, которое использует проверку подлинности Windows для входа пользователей с их учетными записями AD. Теперь мне нужно добавить компонент WebAPI для внешних систем для взаимодействия с приложением. Однако потребители WebAPI должны аутентифицироваться с использованием токенов на предъявителя. Моя мысль состоит в том, чтобы разделить приложение на 2 области - WebApp, которая является текущими контроллерами MVC и представлениями; и WebAPI, которые будут контроллерами REST.

Есть ли способ настроить одну область для использования проверки подлинности Windows (IISDefaults.AuthenticationScheme), а другую область для использования токенов на предъявителя?

1 Ответ

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

Всегда есть способ:)

Допустим, у вас есть область - Area55 - с контроллером API - AlienController -

Создайте свое собственное соглашение о модели контроллера, чтобы любой контроллер в Area55будет авторизован apipolicy

    public class MyAuthorizeFiltersControllerConvention : IControllerModelConvention
    {
        public void Apply(ControllerModel controller)
        {
            string apiArea;

            if (controller.RouteValues.Any() 
                && controller.RouteValues.TryGetValue("area", out apiArea) 
                && apiArea.Equals("Area55"))
            {
                controller.Filters.Add(new AuthorizeFilter("apipolicy"));
            }
            else
            {
                controller.Filters.Add(new AuthorizeFilter("defaultpolicy"));
            }
        }
    }

Затем зарегистрируйте его в файле startup.cs

    services.AddMvc(o =>
            {
                o.Conventions.Add(new MyAuthorizeFiltersControllerConvention());
            });

, который все еще находится в вашем файле startup.cs, настройте политики для использования аутентификациисхема, которую мы хотим

    services.AddAuthorization(o =>
            {
                o.AddPolicy("defaultpolicy", b =>
                {
                    b.RequireAuthenticatedUser();
                    b.AuthenticationSchemes = new List<string> { IISDefaults.AuthenticationScheme };
                });
                o.AddPolicy("apipolicy", b =>
                {
                    b.RequireAuthenticatedUser();
                    b.AuthenticationSchemes = new List<string> { JwtBearerDefaults.AuthenticationScheme };
                });
            });

Контроллер может быть примерно таким

    [Area("Area55")]
    [Route("[area]/api/[controller]")]
    [ApiController]
    public class AlienController : ControllerBase
    {
    }

Это все, что я думаю.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...