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. :)

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