0

当我尝试进行身份验证时,出现以下错误

2021-10-01T11:19:46.162027114Z: [INFO]  : Microsoft.AspNetCore.Diagnostics.ExceptionHandlerMiddleware[1]
2021-10-01T11:19:46.162072114Z: [INFO]        An unhandled exception has occurred while executing the request.
2021-10-01T11:19:46.162078813Z: [INFO]        System.Exception: An error was encountered while handling the remote login.
2021-10-01T11:19:46.163227804Z: [INFO]         ---> System.Exception: Unable to unprotect the message.State.
2021-10-01T11:19:46.163254904Z: [INFO]           --- End of inner exception stack trace ---
2021-10-01T11:19:46.163261804Z: [INFO]           at Microsoft.AspNetCore.Authentication.RemoteAuthenticationHandler`1.HandleRequestAsync()
2021-10-01T11:19:46.163830499Z: [INFO]           at Microsoft.AspNetCore.Authentication.AuthenticationMiddleware.Invoke(HttpContext context)
2021-10-01T11:19:46.163847599Z: [INFO]           at Microsoft.AspNetCore.Localization.RequestLocalizationMiddleware.Invoke(HttpContext context)
2021-10-01T11:19:46.163869499Z: [INFO]           at Microsoft.AspNetCore.Diagnostics.ExceptionHandlerMiddleware.<Invoke>g__Awaited|6_0(ExceptionHandlerMiddleware middleware, HttpContext context, Task task)

我创建了一个核心 mvc 站点,它在 stage 和 dev 中运行良好,但 prod 失败了。我们正在使用 linux docker 来托管 azure app 服务。我们调查并发现当 azure 尝试在 prod 中运行多个实例时会发生此问题。我们在下面找到了一个关于数据保护的链接,但我需要详细了解我需要做什么。 Kubernetes 中的 Azure AD 身份验证无法取消对 message.State 的保护

在 startup.cs 中,身份验证按以下方式配置

services.AddAuthentication(OpenIdConnectDefaults.AuthenticationScheme)
                .AddMicrosoftIdentityWebApp(options =>
                {
                    Configuration.Bind("AzureAD", options);
                    options.AccessDeniedPath = new PathString("/Download");
                    options.Events ??= new OpenIdConnectEvents();
                    options.Events.OnTokenValidated = async (context) =>
                    {
                       //code to get some data from local database
                    };
                });
4

1 回答 1

0

它说的是数据保护,但我需要详细了解我需要做什么。

谢谢travis.js,发布您的建议作为帮助其他社区成员的答案。

“我相信您收到 Unable to unprotect the message.State 错误是因为您的 OIDC 提供商之一正试图解密/取消保护另一个的消息状态。(消息状态只是一个随机字符串,以帮助提高安全性。)

我建议您为每个 OIDC 提供者命名 AuthenticationSchemes,例如 oidc-demooidc-master。然后外部提供者应该将您送回相应的 signin-oidc-demo 端点 signin-oidc-master

--

事实证明,这个答案基本上是正确的。使用多个 OIDC 提供程序时,您需要不同的 AuthenticationSchemes AND CallbackPath 值:

.AddOpenIdConnect("oidc-google", options =>
  {
    options.SignInScheme = IdentityServerConstants.ExternalCookieAuthenticationScheme;
    options.SignOutScheme = IdentityServerConstants.SignoutScheme;
    options.CallbackPath = "/signin-oidc-google";
    ...
  }
.AddOpenIdConnect("oidc-microsoft", options =>
  {
    options.SignInScheme = IdentityServerConstants.ExternalCookieAuthenticationScheme;
    options.SignOutScheme = IdentityServerConstants.SignoutScheme;
    options.CallbackPath = "/signin-oidc-microsoft";
    ...
  }

请注意,身份验证中间件将神奇地处理任何 CallbackPath 已配置的内容,因此不需要显式处理。

如果您不区分 OIDC 提供商并使用单独的回调路径,他们可能会尝试使用相同的方案登录,并且加密将不匹配,并且只有在您的代码中注册的第一个 OIDC 提供商才能工作。”

有关详细信息,请参阅此 Microsoft 文档:Azure AD 身份验证和授权错误代码

于 2021-10-06T13:24:50.210 回答