User.Identity.Name имеет значение null после федеративного входа в Azure AD с помощью aspnetcore 2.2 - PullRequest
0 голосов
/ 30 января 2019

Я внимательно следил за примером AzureAD aspnetcore, чтобы попытаться внедрить аутентификацию Azure AD в нашем веб-приложении aspnetcore 2.2.Я могу успешно войти в систему с помощью Azure AD.Однако имя пользователя не отображается ПОСЛЕ входа в систему.

https://github.com/Azure-Samples/active-directory-b2c-dotnetcore-webapp

Это значение следует читать в представлении из свойства User.Identity.Name.

User.Identity.Name

При дальнейшей проверке я вижу, что основные претензии правильно возвращаются в заявку.Однако по какой-то причине объект HttpContext.User заполнен неправильно.Я не знаю, почему это происходит.Когда я смотрю на то же значение из примера выше, HttpContext правильно установлен.Для пояснения я реализовал обработчик OnSecurityTokenValidated и использую этот контекст:

context

Как видно, userPrincipal имеет ожидаемые утверждения.

userPrincipal

Однако к httpContext претензий нет.Кроме того, User.Identity.Name, следовательно, имеет значение null:

httoContext

Я пытался выполнить вход вручную, но это также не работает:

private async Task SignInUser(TokenValidatedContext tokenValidatedContext)
{
    var httpContext = tokenValidatedContext.HttpContext;
    var userPrincipal = tokenValidatedContext.Principal;

    await httpContext.SignOutAsync(AppSettings.CookieName);
    await httpContext.SignInAsync(AppSettings.CookieName, userPrincipal,
      new AuthenticationProperties
      {
          ExpiresUtc = DateTime.UtcNow.AddDays(1),
          IsPersistent = false,
          AllowRefresh = false
      });
}

Обновление

name

Я устанавливаю NameClaimType, как показановыше.NameClaimType устанавливается в Configure

Кто-нибудь знает, что я делаю неправильно?

Я использую библиотеки Visual Studio 2017 и aspnetcore 2.2.Я обновил Microsoft.Identity.Client до 2,7

.

Ответы [ 2 ]

0 голосов
/ 01 февраля 2019

Я думаю, что у меня есть ответ на этот вопрос, хотя это приводит к новым вопросам.

По сути, наш код использует Identity, а также AzureADB2C.Идентификация конфликтует с процессом входа в AzureADB2C.Вход успешен, и токен возвращается, но по возвращении он каким-то образом стирается Identity.

Это код, который у меня есть в Startup.cs:

            services.AddAuthentication(sharedOptions =>
            {
                sharedOptions.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme;
                sharedOptions.DefaultChallengeScheme = OpenIdConnectDefaults.AuthenticationScheme;
            })
            .AddAzureAdB2C(options => Configuration.Bind("Authentication:AzureAdB2C", options))
            .AddCookie();

        services.Configure<CookiePolicyOptions>(options =>
        {
            // This lambda determines whether user consent for non-essential cookies is needed for a given request.
            options.CheckConsentNeeded = context => true;
            options.MinimumSameSitePolicy = SameSiteMode.None;
        });

        services.Configure<ApiBehaviorOptions>(options =>
        {
            options.InvalidModelStateResponseFactory = ctx => new ValidationProblemDetailsResult();
        });

        services.AddOptions();

        ConfigureMvc(services);

        // Add Identity services to the services container.
        services.SetupIdentity();

SetupIdentity isметод расширения, который содержит следующее:

            services.AddIdentity<ApplicationUser, ApplicationRole>(o => {
            o.Password.RequiredLength = 8;
            o.Password.RequireDigit = true;
            o.Password.RequireLowercase = true;
            o.Password.RequireUppercase = true;
            o.Password.RequireNonAlphanumeric = true;
        })
            .AddEntityFrameworkStores<ApplicationContext>()
            .AddDefaultTokenProviders()
            .AddUserStore<UserStore<ApplicationUser, ApplicationRole, ApplicationContext, Guid>>()
            .AddRoleStore<RoleStore<ApplicationRole, ApplicationContext, Guid>>();

Идея состоит в том, что AAD будет использоваться для аутентификации, а локальные роли идентификации будут использоваться для предоставления пользователю различных разрешений в приложении.Исходя из этой проблемы, похоже, что нам придется переосмыслить нашу безопасность.

Вопрос в том, могут ли AAD и Identity действительно не использоваться вместе?Я хотел бы сценарий, где идентификатор пользователя из AAD возвращается, хранится в локальном SQL, а затем этот идентификатор пользователя используется в локальной базе данных для подключения пользователя к переменным объектам.Если AAD и Identity не могут использоваться вместе, какова альтернатива?Т.е. каков наилучший способ подключения пользователя AAD к локальной базе данных?Может кто-нибудь указать мне некоторые статьи MS, которые обсуждают это?

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

Вы устанавливаете NameClaimType в OpenIdConnectOptions конфигурации:

options.TokenValidationParameters = new TokenValidationParameters() { NameClaimType = "name" };

Чтобы протестировать сценарий, я создаю новое приложение asp.net core 2.2 с шаблоном MVC по умолчанию:

  1. Установите Microsoft.Identity.Client версии 2.7
  2. Скопируйте MSALSessionCache, AzureAdB2COptions, OpenIdConnectOptionsSetup из примера кода
  3. Обновите Startup.cs и appsettings.json на основена конфигурации примера кода.

Я не создавал свое собственное приложение и Api, просто использовал домен fabrikamb2c в качестве примера кода, хотя какой-то метод устарел в .net core 2.2, например, cache.HasStateChanged.Аутентификация по-прежнему работает, и вы можете получить правильное имя с User.Identity.Name, HttpContext.User.Claims:

enter image description here

Вы можете предоставить больше деталей, чтобы помочь воспроизвести вашевыпуск.

...