Ошибка при использовании OpenID Connect со службой .NET Core 3.0 ASP.NET Core API - PullRequest
1 голос
/ 11 октября 2019

Я пытаюсь реализовать OpenID Connect с Azure AD в службе API .NET Core 3.0 ASP.NET Core.

Это только служба API, без пользовательского интерфейса, и используется отдельный SPA. для доступа к службе API.

В соответствии с инструкциями здесь я отправляю запрос на вход в мой SPA, который после аутентификации перенаправляется обратно в конечную точку /signin-oidcна моем API.

В этот момент я получаю сообщение об ошибке: -

Error from RemoteAuthentication: "Unable to unprotect the message.State.".

Первоначальный запрос от SPA выглядит следующим образом: -

tenantId = my Azure AD tenant ID
clientId = my Azure AD application ID
responseType = "id_token"
redirectUri = "http://localhost:12345/signin-oidc"
scope = "openid"
responseMode = "form_post"
state = "12345"
nonce = "67890"

https://login.microsoftonline.com/{tenantId}/oauth2/v2.0/authorize?client_id={clientId}&response_type={responseType}&redirect_uri={redirectUri}&scope={scope}&response_mode={responseMode}&state={state}&nonce={nonce}

Имой код запуска API выглядит следующим образом: -

services.AddAuthentication(AzureADDefaults.BearerAuthenticationScheme)
    .AddAzureAD(o =>
    {
        o.ClientId = "(tenant id)";
        o.TenantId = "(client id)";
        o.Instance = "https://login.microsoftonline.com/";
    })
    .AddAzureADBearer(o =>
    {
        o.ClientId = "(tenant id)";
        o.TenantId = "(client id)";
        o.Instance = "https://login.microsoftonline.com/";
    });

Если я опускаю параметр состояния в начальном запросе, я получаю другую ошибку: -

Error from RemoteAuthentication: "OpenIdConnectAuthenticationHandler: message.State is null or empty.".

В указанных инструкциях говорится, чтоstate рекомендуется, не обязательно: -

Значение, включенное в запрос, которое также будет возвращено в ответе токена. Это может быть строка любого содержимого, которое вы хотите. Случайно генерируемое уникальное значение обычно используется для предотвращения атак подделки межсайтовых запросов. Состояние также используется для кодирования информации о состоянии пользователя в приложении до того, как запрос аутентификации произошел, например, о странице или просмотре пользователя.

Однако ошибки, которые я получаю, кажутсяподразумевается, что state требуется и должен быть специально сгенерирован.

Я также пробовал использовать следующий код запуска и получаю те же ошибки: -

services.AddAuthentication(options =>
{
    options.DefaultScheme = Microsoft.AspNetCore.Authentication.Cookies.CookieAuthenticationDefaults.AuthenticationScheme;
    options.DefaultChallengeScheme = OpenIdConnectDefaults.AuthenticationScheme;
})
    .AddCookie()
    .AddOpenIdConnect(options =>
    {
        options.ClientId = "(client id)";
        options.Authority = "https://login.microsoftonline.com/" + "(tenant id)";
    });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...