Azure AD B2 C ошибка AADB2C90057, когда я НЕ пытаюсь использовать неявный поток - PullRequest
0 голосов
/ 02 мая 2020

Я использую ASP. NET Core 3.1 и Azure AD B2 C. Моя цель - использовать Поток кода авторизации для всего моего веб-приложения, но документация не является прямой.

Я следовал приведенным здесь инструкциям: Веб-приложение, которое выполняет вход пользователи: конфигурация кода

Однако, когда я пытаюсь получить доступ к своему веб-сайту, я получаю следующую ошибку:

[ERR] Сообщение содержит ошибку: «unauthorized_client», error_description: '"AADB2C90057: Предоставленное приложение не настроено для разрешения неявного потока' OAuth '. НЕ включайте ни одну из двух опций для неявного предоставления (токены доступа и токены ID).

Опять же, моя цель - использовать поток кода авторизации везде.

Любая идея, почему я получить сообщение о том, что мое приложение должно быть настроено для разрешения неявного потока? Как мне настроить его на использование потока кода авторизации?

1 Ответ

1 голос
/ 04 мая 2020

Если вы хотите безопасно подключать пользователей к веб-приложениям, нам следует использовать протокол OpenId Connect. Тип ответа должен содержать id_token. Поэтому нам нужно включить Implicit Grant. Для получения более подробной информации, пожалуйста, обратитесь к документу и документу

. Что касается реализации OpenId connect в. net основном веб-приложении, мы можем использовать sdk Microsoft.AspNetCore.Authentication.AzureADB2C.UI. Подробные шаги приведены ниже:

  1. Зарегистрировать веб-приложение в Azure AD B2 C арендатор

  2. Внедрите Azure AD B2 C auth в веб-приложение

    a. Добавьте следующие настройки в настройках приложения. json

     {
    "AzureAdB2C": {
    "Instance": "https://<your-tenant-name>.b2clogin.com",
    "ClientId": "<web-app-application-id>",
    "Domain": "<your-b2c-domain>"
    "CallbackPath": "/signin-oidc",
    "SignUpSignInPolicyId": "B2C_1_test",
    "ResetPasswordPolicyId": "B2C_1_test2",
    "EditProfilePolicyId": "B2C_1_test1"
    },
    ...
    }
    
    

    b. добавьте следующий код в Startup.cs

     public void ConfigureServices(IServiceCollection services)
      {
    
    
          services.AddAuthentication(AzureADB2CDefaults.AuthenticationScheme)
              .AddAzureADB2C(options => Configuration.Bind("AzureAdB2C", options));
    
           services.AddRazorPages();
      }
    
      // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
      public void Configure(IApplicationBuilder app, IHostingEnvironment env)
      {
           if (env.IsDevelopment())
          {
              app.UseDeveloperExceptionPage();
          }
          else
          {
              app.UseExceptionHandler("/Error");
              // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
              app.UseHsts();
          }
    
          app.UseHttpsRedirection();
          app.UseStaticFiles();
    
          app.UseRouting();
    
          app.UseAuthentication();
          app.UseAuthorization();
    
          app.UseEndpoints(endpoints =>
          {
              endpoints.MapRazorPages();
              endpoints.MapControllers();
          });
      }
    

    c. Реализовать вход и выход. SDK помог нам реализовать метод входа и выхода. Таким образом, мы можем напрямую использовать это. Например

    мой логин.cs html

          @using System.Security.Principal
    @using Microsoft.AspNetCore.Authentication.AzureADB2C.UI
    @using Microsoft.Extensions.Options
    @inject IOptionsMonitor<AzureADB2COptions> AzureADB2COptions
    
    @{
       var options = AzureADB2COptions.Get(AzureADB2CDefaults.AuthenticationScheme);
    }
    
    
    <ul class="navbar-nav">
    @if (User.Identity.IsAuthenticated)
    {
    
               <li class="nav-item">
                   <span class="nav-text text-dark">Hello @User.Identity.Name!</span>
               </li>
    
           <li class="nav-item">
               <a class="nav-link text-dark" asp-area="AzureADB2C" asp-controller="Account" asp-action="SignOut">Sign out</a>
           </li>
    }
    else
    {
           <li class="nav-item">
               <a class="nav-link text-dark" asp-area="AzureADB2C" asp-controller="Account" asp-action="SignIn">Sign in</a>
           </li>
    }
    </ul>
    
  3. Тест enter image description here


Обновление

Если вы хотите использовать код авторизации, измените код startup.cs, как показано ниже.

public void ConfigureServices(IServiceCollection services)
        {
            services.AddAuthentication(AzureADB2CDefaults.AuthenticationScheme)
                .AddAzureADB2C(options => Configuration.Bind("AzureAdB2C", options));

            services.Configure<OpenIdConnectOptions>(AzureADB2CDefaults.OpenIdScheme, options =>
            {

                options.UsePkce = false;
                options.ResponseType = "code";
                options.Scope.Add("offline_access");
                options.Events = new OpenIdConnectEvents()
                {

                    OnAuthorizationCodeReceived = async context => {
                        var code = context.ProtocolMessage.Code;
                        var request = context.HttpContext.Request;
                        string currentUri = UriHelper.BuildAbsolute(
                           request.Scheme,
                           request.Host,
                           request.PathBase,
                           options.CallbackPath);

                        IConfidentialClientApplication cca = ConfidentialClientApplicationBuilder.Create(options.ClientId)
                            .WithB2CAuthority(options.Authority)
                            .WithRedirectUri(currentUri)
                            .WithClientSecret(options.ClientSecret)
                            .Build();


                        try
                        {
                            AuthenticationResult result = await cca.AcquireTokenByAuthorizationCode(options.Scope, code)
                                .ExecuteAsync();
                            context.HandleCodeRedemption(result.AccessToken, result.IdToken);
                        }
                        catch (Exception ex)
                        {
                            //TODO: Handle
                            throw;
                        }
                    }
                };



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