ASP.NET Core Microsoft Identity выйти из системы «Поле схемы является обязательным».
Я использую ASP.NET Core 5 с аутентификацией Azure AD.
Я создал новое веб-приложение с шаблоном, и вход и выход с помощью Azure AD отлично работают.
Но когда я скопировал соответствующий код в и
appsettings.json
из веб-приложения шаблона в другое веб-приложение, я получаю ответ об ошибке 400, когда нажимаю ссылку «Выйти» на / MicrosoftIdentity / Account / SignOut
["The scheme field is required."]
в
Startup.cs
, Я добавил:
services.AddAuthentication(OpenIdConnectDefaults.AuthenticationScheme)
.AddMicrosoftIdentityWebApp(Configuration.GetSection("AzureAd"));
и
services.AddRazorPages()
.AddMicrosoftIdentityUI();
Я сравнил запросы в шаблоне веб-приложения, которое работает, и другого веб-приложения, которое не работает, и я не вижу никакой разницы в заголовках запросов на / MicrosoftIdentity / Account / SignOut.
Какая «схема» мне не хватает?
2 ответа
После указателя @Leaky о том, чтобы посмотреть на
Microsoft.Identity.Web
SignOut()
исходный код, я изменил структуру URL-адреса выхода, чтобы явно включить
scheme
такой параметр:
@if (User.Identity.IsAuthenticated)
{
var parms = new Dictionary<string, string>
{
{ "scheme", OpenIdConnectDefaults.AuthenticationScheme }
};
<a asp-area="MicrosoftIdentity" asp-controller="Account" asp-action="SignOut"
asp-all-route-data="parms">
Sign out
</a>
}
Теперь, когда я наводил указатель мыши на ссылку, а не:
https://localhost:44350/MicrosoftIdentity/Account/SignOut
Ссылка для выхода выглядит так:
https://localhost:44350/MicrosoftIdentity/Account/SignOut/OpenIdConnect
И полный выход работает без ошибок.
Я изучил исходный код ( см. Здесь ) и MVC, и я думаю, что единственное разумное объяснение состоит в том, что в вашем втором проекте включена функция C # 8 ссылочных типов, допускающих значение NULL .
Мне удалось воспроизвести ошибку, когда я включил значения NULL.
Происходит то, что
SignOut
Действие имеет следующие атрибуты и подпись:
// From Microsoft.Identity.Web.UI/AccountController.cs
// See: https://github.com/AzureAD/microsoft-identity-web/blob/master/src/Microsoft.Identity.Web.UI/Areas/MicrosoftIdentity/Controllers/AccountController.cs
/// <summary>
/// Handles the user sign-out.
/// </summary>
/// <param name="scheme">Authentication scheme.</param>
/// <returns>Sign out result.</returns>
[HttpGet("{scheme?}")]
public IActionResult SignOut([FromRoute] string scheme)
{
...
}
Когда у вас включены значения NULL, это вызывает ошибку, которую вы наблюдали, потому что
scheme
в сигнатуре метода больше не является обязательной. Проблема аналогична этой проблеме GitHub .
Я подозреваю, что, хотя поддержка значений NULL была добавлена в ASP.NET Core и (я полагаю) большинство его компонентов в 2020 году,
Microsoft.Identity.Web
не получил такого же лечения (на самом деле он полностью отделен от ASP.NET Core; он является частью AzureAD .
Что, возможно, более интересно, так это то, почему другие действия учетной записи (имеющие аналогичную подпись) не приводят к той же ошибке. Я не использую ни значения NULL, ни Microsoft.Identity.Web, поэтому у меня нет информации по этому поводу.
Но, конечно, дайте мне знать, если я ошибаюсь, и у вас не включены значения NULL. :)