Аутентификация ASP.Net 5 с помощью Azure - претензии, похоже, изменились

Вкратце

Следует ли использовать при аутентификации с помощью Azure ADFS?

Более подробно

У меня есть приложение ASP.NET Core, которое недавно было обновлено с 3.1 до .NET 5.

Раньше он использовал следующий пакет NuGet:

      <PackageReference Include="Microsoft.AspNetCore.Authentication.AzureAD.UI" Version="3.1.9" />

и следующее в моем StartUp.cs:

      services.AddAuthentication(AzureADDefaults.AuthenticationScheme)
    .AddAzureAD(options => this.Configuration.Bind("AzureAd", options));

Сегодня я обновил пакет NuGet:

      <PackageReference Include="Microsoft.AspNetCore.Authentication.AzureAD.UI" Version="5.0.3" />

И сразу получил предупреждения, что я использую устаревший / устаревший код.

Меня направили на веб- страницу Microsoft Identity для получения дополнительной информации ... казалось, мне пришлось долго копаться, чтобы найти то, что я хотел.

Однако я прочитал, что в предварительной версии Visual Studio был обновленный шаблон проекта, поэтому я создал новый проект, подключенный к Azure, и вошел в систему с учетными данными своего домена. Фантастика!

Соответствующие пакеты NuGet, которые он использовал, выглядят так:

      <PackageReference Include="Microsoft.AspNetCore.Authentication.JwtBearer" Version="5.0.3" NoWarn="NU1605" />
<PackageReference Include="Microsoft.AspNetCore.Authentication.OpenIdConnect" Version="5.0.3" NoWarn="NU1605" /
<PackageReference Include="Microsoft.Identity.Web" Version="1.1.0" />
<PackageReference Include="Microsoft.Identity.Web.UI" Version="1.1.0" />

Итак, аутентификация завершена. Теперь об авторизации ...

Таким образом, у нас есть собственная служба авторизации. Мы отправляем туда удостоверение пользователя (из ADFS), и он возвращает то, что им разрешено делать. Здесь все сломалось ....

В нашем исходном коде для этого использовалось утверждение Upn из ответа от Azure ADFS:

      Claim? upnClaim = identity.FindFirst(ClaimTypes.Upn);

Это возвращает претензию с адресом электронной почты.

Однако теперь это вернуло значение null.

Следующий код получил заявку с адресом электронной почты:

      Claim? upnClaim = identity.FindFirst("preferred_username");

Итак, я могу работать с этим, и это сработает ...

Однако я хотел бы знать, используете ли OpenIdConnectDefaults.AuthenticationSchemeявляется предпочтительным вариантом для последней версии Microsoft Identity и Azure ADFS? Тот факт, что мне нужно использовать волшебную строку «имя_пользователя», а не ClaimTypes.Upn вызывает у меня некоторые сомнения.

Есть ли у кого-нибудь глубокое понимание этого?

1 ответ

Тот факт, что мне нужно использовать волшебную строку «имя_пользователя» вместо ClaimTypes.Upn, вызывает у меня некоторые сомнения.

preferred_usernameне является волшебной строкой, она задокументирована как одно из утверждений, которые AAD добавляет к полезной нагрузке токена идентификатора, см. https://docs.microsoft.com/azure/active-directory/develop/id-tokens#payload-claims .

Базовая библиотека, используемая поставщиком OpenID Connect ASP.NET Core, используемая для сопоставления утверждений в соответствии с хорошо известными утверждениями в мире .NET. Возможно, Microsoft.Identity.Web отключает это конкретное поведение.

Я писал об этом некоторое время назад на https://mderriey.com/2019/06/23/where-are-my-jwt-claims/ .

Другие вопросы по тегам