Как добавить AzureAD AND AzureADBearer в веб-интерфейс asp.net core 2.2 - PullRequest
3 голосов
/ 16 апреля 2019

Я пытаюсь создать веб-сайт, который использует AzureAD для аутентификации пользователей для доступа к пользовательским интерфейсам для создания элементов в БД. И я также хочу, чтобы этот API вызывался другими службами через токен на предъявителя.

services.AddAuthentication(o => {
                    o.DefaultScheme = AzureADDefaults.BearerAuthenticationScheme;
                    o.DefaultAuthenticateScheme = AzureADDefaults.AuthenticationScheme;
                })
                .AddAzureAD(options => Configuration.Bind("AzureAd", options))
                .AddAzureADBearer(options => Configuration.Bind("AzureAd", options));

Я хочу, чтобы пользователи проходили проверку подлинности с использованием схемы AzureAD, но службы для одного и того же WEB API (по другому маршруту) должны проходить проверку подлинности на предъявителя. Или есть все маршруты, кроме обоих. Либо работает

Ответы [ 3 ]

2 голосов
/ 22 апреля 2019

в итоге решил эту проблему, создав схему политики, которая переключается между двумя схемами в зависимости от присутствующего заголовка auth:

// add azure ad user and service authentication
            services
                .AddAuthentication("Azures")
                .AddPolicyScheme("Azures", "Authorize AzureAd or AzureAdBearer", options =>
                {
                    options.ForwardDefaultSelector = context =>
                    {
                        var authHeader = context.Request.Headers["Authorization"].FirstOrDefault();
                        if (authHeader?.StartsWith("Bearer") == true)
                        {
                            return AzureADDefaults.JwtBearerAuthenticationScheme;
                        }

                        return AzureADDefaults.AuthenticationScheme;
                    };
                })
                .AddAzureADBearer(options => config.Bind("AzureAdBearer", options))
                .AddAzureAD(options => config.Bind("AzureAd", options));
1 голос
/ 16 апреля 2019

Вы можете добавить промежуточное программное обеспечение AddAzureADBearer к своему приложению:

services.AddAuthentication(sharedOptions =>
{
    sharedOptions.DefaultChallengeScheme = AzureADDefaults.AuthenticationScheme;
    sharedOptions.DefaultAuthenticateScheme = AzureADDefaults.AuthenticationScheme;
})
.AddAzureAD(options => Configuration.Bind("AzureAd", options))
.AddAzureADBearer(options => Configuration.Bind("AzureAdBearer", options));

Предположим, что в вашем приложении есть контроллер api, если другое приложение получит доступ к веб-API, защищенному AAD, вы должны установитьсхема:

[HttpGet]
[Authorize(AuthenticationSchemes = "AzureADBearer")]
public IEnumerable<string> Get()
{
    return new string[] { "value1", "value2" };
}
0 голосов
/ 02 мая 2019

Вот как я решил эту проблему для типа предоставления клиентских учетных данных OAuth .

  1. Первый AddAuthentication в ConfigureServices метод в вашем Startup классе:

    public void ConfigureServices(IServiceCollection services)
    {
     //...
     services.AddAuthentication(AzureADDefaults.BearerAuthenticationScheme)
             .AddAzureADBearer(options => Configuration.Bind("AzureAd", options));
    }
    

    Убедитесь, что у вас есть AzureAd опции в appconfig.json:

    "AzureAd": {
          "Instance": "https://login.microsoftonline.com/",
          "Domain": "yourdomain.com",
          "TenantId": "5ce97df2-9be2-4deb-b90a-880d6668a5ff",// fake, replace with yours
          "ClientId": "444e3f38-3420-430d-8254-1541ae545047"// fake, replace with yours
     },
    
  2. Вызовите метод UseAuthentication в методе Configure вашего Startup класса

    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {
        //...
       app.UseAuthentication();
        app.UseMvc();
    }
    
  3. Добавьте атрибут Authorize к вашему контроллеру:

    [ApiController]
    [Authorize]
    public class YourController : ControllerBase
    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...