IDX21323 OpenIdConnectProtocolValidationContext.Nonce 为空,OpenIdConnectProtocolValidatedIdToken.Payload.Nonce 不为空

Mic*_*gan 12 c# orchardcms azure-active-directory microsoft-graph-api

我正在尝试对内部网的 Azure AD 和 Graph 进行身份验证(基于 Orchard CMS),这在我的本地机器上按预期运行,但是,当访问将是生产站点的站点时(已经在我们的内部 dns 上设置了 ssl ),我有时会收到上述错误,它相对不一致,我部门中的其他人在访问时通常会收到此错误。

我的身份验证控制器如下:

public void LogOn()
    {
        if (!Request.IsAuthenticated)
        {

            // Signal OWIN to send an authorization request to Azure.
            HttpContext.GetOwinContext().Authentication.Challenge(
              new AuthenticationProperties { RedirectUri = "/" },
              OpenIdConnectAuthenticationDefaults.AuthenticationType);
        }
    }

    public void LogOff()
    {
        if (Request.IsAuthenticated)
        {
            ClaimsPrincipal _currentUser = (System.Web.HttpContext.Current.User as ClaimsPrincipal);

            // Get the user's token cache and clear it.
            string userObjectId = _currentUser.Claims.First(x => x.Type.Equals(ClaimTypes.NameIdentifier)).Value;

            SessionTokenCache tokenCache = new SessionTokenCache(userObjectId, HttpContext);
            HttpContext.GetOwinContext().Authentication.SignOut(OpenIdConnectAuthenticationDefaults.AuthenticationType, CookieAuthenticationDefaults.AuthenticationType);
        }

        SDKHelper.SignOutClient();

        HttpContext.GetOwinContext().Authentication.SignOut(
          OpenIdConnectAuthenticationDefaults.AuthenticationType, CookieAuthenticationDefaults.AuthenticationType);
    }
Run Code Online (Sandbox Code Playgroud)

我的 openid 选项配置如下:

AntiForgeryConfig.UniqueClaimTypeIdentifier = ClaimTypes.NameIdentifier;

        var openIdOptions = new OpenIdConnectAuthenticationOptions
        {
            ClientId = Settings.ClientId,
            Authority = "https://login.microsoftonline.com/common/v2.0",
            PostLogoutRedirectUri = Settings.LogoutRedirectUri,
            RedirectUri = Settings.LogoutRedirectUri,
            Scope = "openid email profile offline_access " + Settings.Scopes,
            TokenValidationParameters = new TokenValidationParameters
            {
                ValidateIssuer = false,
            },
            Notifications = new OpenIdConnectAuthenticationNotifications
            {
                AuthorizationCodeReceived = async (context) =>
                {
                    var claim = ClaimsPrincipal.Current;
                    var code = context.Code;                        

                    string signedInUserID = context.AuthenticationTicket.Identity.FindFirst(ClaimTypes.NameIdentifier).Value;


                    TokenCache userTokenCache = new SessionTokenCache(signedInUserID,
                        context.OwinContext.Environment["System.Web.HttpContextBase"] as HttpContextBase).GetMsalCacheInstance();
                    ConfidentialClientApplication cca = new ConfidentialClientApplication(
                        Settings.ClientId,
                        Settings.LogoutRedirectUri,
                        new ClientCredential(Settings.AppKey),
                        userTokenCache,
                        null);


                    AuthenticationResult result = await cca.AcquireTokenByAuthorizationCodeAsync(code, Settings.SplitScopes.ToArray());
                },
                AuthenticationFailed = (context) =>
                {
                    context.HandleResponse();
                    context.Response.Redirect("/Error?message=" + context.Exception.Message);
                    return Task.FromResult(0);
                }
            }
            };

        var cookieOptions = new CookieAuthenticationOptions();
        app.SetDefaultSignInAsAuthenticationType(CookieAuthenticationDefaults.AuthenticationType);

        app.UseCookieAuthentication(cookieOptions);

        app.UseOpenIdConnectAuthentication(openIdOptions);
Run Code Online (Sandbox Code Playgroud)

重定向的 url 在 apps.dev.microsoft.com 和我们本地化的 web 配置中保持一致。

Ven*_*sky 16

就我而言,这是一个非常奇怪的问题,因为它不会对每个人都发生,只有少数客户和开发人员有这个问题。

如果您仅在 chrome(或具有相同引擎的浏览器)中遇到此问题,您可以尝试在 chrome 上将此标志设置为禁用。

在此处输入图片说明

这里发生的事情是 chrome 有这个不同的安全规则,即“如果没有设置安全属性的没有 SameSite 限制的 cookie,它将被拒绝”。所以你可以禁用这个规则,它会起作用。

或者,您也可以设置 Secure 属性,但我不知道该怎么做;(

  • 这为我修复了错误 IDX21323。根本原因:Microsoft 代码示例使用 https(端口 443),我自己的项目使用 http(端口 80)。为了避免更改 Chrome 标志,您的开发 Web 服务器需要通过 https 访问。 (8认同)
  • 不知道过去 7 天发生了什么,今天本地一切都工作正常,但事实并非如此。我禁用了同一个标志,现在一切正常。 (2认同)

Nar*_*ppa 7

检查 AD 应用注册 --> 设置 --> 回复 URL 中提到的 URL。例如,如果 url 是https://localhost:44348/

转到 MVC 项目 --> 属性(右键单击和属性)--> Web 部分 --> 开始 URL 和项目 URL 也应该是https://localhost:44348/

这为我解决了这个问题。另一个选项是在 Startup.Auth 中动态设置 AD 身份验证后的重定向 URL


Adr*_*pez 7

IDX21323如何解决

这行代码解决了问题,错误的原因是 ASP.NET 还没有创建会话信息。函数“authFailed.OwinContext.Authentication.Challenge()”用身份验证所需的信息填充标头。


        app.UseOpenIdConnectAuthentication(new OpenIdConnectAuthenticationOptions()
    {
        Notifications = new OpenIdConnectAuthenticationNotifications()
        {
            AuthenticationFailed = AuthenticationFailedNotification<OpenIdConnect.OpenIdConnectMessage, OpenIdConnectAuthenticationOptions> authFailed =>
            {
                if (authFailed.Exception.Message.Contains("IDX21323"))
                {
                    authFailed.HandleResponse();
                    authFailed.OwinContext.Authentication.Challenge();
                }

                await Task.FromResult(true);
            }
        }
    });
Run Code Online (Sandbox Code Playgroud)

  • 就我而言,原因是登录后单击浏览器的_后退_按钮。这会导致使用缓存的 NONCE,从而导致 IDX21323 错误。简单地发出另一个“OwinContext.Authentication.Challenge()”来创建一个“新鲜”的 NONCE 对我来说似乎并不是那么麻烦。 (5认同)
  • 这来自微软文档,正是你所说的,也许不是黑客:https://learn.microsoft.com/en-us/answers/questions/137574/azure-active-directory-authentication-error-owin .html (4认同)
  • 请添加一些有关此代码如何回答问题的说明以改进您的答案。 (3认同)

red*_*alx 6

请参阅Chris Ross(在 github 上称为 Tratcher)的System.Web 响应 cookie 集成问题。OWIN cookie 管理器和 ASP.NET Framework 中内置的原始 cookie 管理可能会以无益的方式发生冲突,并且没有通用的解决方案。但是,在设置 OIDC 身份验证时,我发现该链接中建议的解决方法对我有用:

app.UseCookieAuthentication(new CookieAuthenticationOptions
{
   // ...
   CookieManager = new SystemWebCookieManager()
});
Run Code Online (Sandbox Code Playgroud)

和:

OpenIdConnectAuthenticationOptions.CookieManager = new SystemWebCookieManager();
Run Code Online (Sandbox Code Playgroud)

这会导致 OWIN 使用 ASP.NET Framework cookie jar/store 并避免冲突。我想他会有副作用,所以要小心!阅读链接以获得完整的解释。


Dav*_*nga 5

由于它不一致,这让我相信您看到的错误是由人们所说的“Katana bug #197”引起的。

幸运的是,有一个名为Kentor.OwinCookieSaver的 nuget 包的解决方法。

安装 nuget 包后添加app.UseKentorOwinCookieSaver();之前的app.UseCookieAuthentication(cookieOptions);.

有关更多信息,请查看GitHub 上的 Kentor.OwinCookieSaver 存储库

  • 此包 Kentor.OwinCookieSaver 已被弃用。 (3认同)