Я пытаюсь реализовать 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)";
});