IDX21323 OpenIdConnectProtocolValidationContext.Nonce为null,OpenIdConnectProtocolValidatedIdToken.Paylocad.Nonce不为null

时间:2018-04-20 14:33:06

标签: c# azure-active-directory microsoft-graph orchardcms

我正在尝试为Azure AD和Graph for Intranet(基于Orchard CMS)进行身份验证,这在我的本地计算机上可以正常运行,但是,当访问将成为生产站点时(已经使用ssl设置)我的内部dns),我有时会得到上述错误,它相对不一致,访问时我的部门中的其他人通常会收到此错误。

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

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);
    }

我的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);

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

9 个答案:

答案 0 :(得分:9)

在我的情况下,这是一个非常奇怪的问题,因为并不是每个人都遇到这种情况,只有很少的客户和开发人员会遇到此问题。

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

enter image description here

这里发生的是chrome具有此不同的安全规则,即“如果设置了没有SameSite限制的cookie而没有Secure属性,它将被拒绝”。因此,您可以禁用此规则,它将起作用。

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

答案 1 :(得分:2)

也请检查此链接: https://docs.microsoft.com/en-us/aspnet/samesite/owin-samesite

对我来说,起初它不起作用,但是解决方案是使用https。我使用的Visual Studio IIS Express使用http托管一个默认的网站。在测试中,由于https而起作用。

答案 2 :(得分:1)

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

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

安装nuget软件包后,在app.UseKentorOwinCookieSaver();之前添加app.UseCookieAuthentication(cookieOptions);

有关详情,请查看Kentor.OwinCookieSaver repo on GitHub

答案 3 :(得分:1)

在生产环境中我遇到了同样的错误,而在本地它对所有开发团队都有效。我已经尝试了Michael Flanagan建议的Kentor.OwinCookieSaver解决方案,但没有帮助。深入研究后,我发现身份验证本身已成功完成,并且 OwinContext 包含用户身份和声明,但是引发了 AuthenticationFailed 事件处理程序,并带有IDX21323异常。因此,我决定使用以下解决方法-更新了 AuthenticationFailed 事件处理程序:

// skip IDX21323 exception
if (context.Exception.Message.Contains("IDX21323"))
{
   context.SkipToNextMiddleware();
} else {
   context.HandleResponse();
   context.Response.Redirect("/Error?message=" + context.Exception.Message);
}
return Task.FromResult(0);

这样,系统不会抛出IDX21323异常,而是继续进行身份验证过程,并允许用户登录和使用系统。

我知道这不是解决方案,但是至少在我找到解决此问题的更好方法之前,至少用户现在可以登录。

答案 4 :(得分:1)

How to solve IDX21323

此行代码解决了问题,错误的原因是ASP.NET尚未创建sessión信息。函数“ 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);
            }
        }
    });

答案 5 :(得分:0)

检查AD App注册->设置->答复URL中提到的URL。例如,如果该网址是https://localhost:44348/

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

这已为我解决了该问题。另一种选择是在Startup.Auth

中在AD身份验证后动态设置重定向URL。

答案 6 :(得分:0)

我的开始和项目URL与Azure中的重定向URI不同。我进行了所有这些匹配,不再遇到IDX2132错误。

答案 7 :(得分:0)

天蓝色的问题?

确保使用正确的域名。我正在Azure上调试一些防火墙问题,并使用my-subdomain.azurewebsites.net来查看站点本身是否启动,一旦启动,我忘记将域名改回my-subdomain.mydomainname.org。

答案 8 :(得分:0)

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

app.UseCookieAuthentication(new CookieAuthenticationOptions
{
   // ...
   CookieManager = new SystemWebCookieManager()
});

并且:

OpenIdConnectAuthenticationOptions.CookieManager = new SystemWebCookieManager();

这将导致OWIN使用ASP.NET Framework Cookie罐/存储并避免冲突。我想他会有副作用,所以要小心行事!阅读链接以获取完整说明。