Аутентификация 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/ .