使用Okta进行身份验证时,GetExternalLoginInfoAsync始终返回null

时间:2019-05-15 09:20:41

标签: owin saml okta sustainsys-saml2

我目前正在尝试让Okta与我们基于MVC的应用程序一起使用。不幸的是,我不是原始代码的原始设计者或作者。但是,经过一番挖掘,我发现我的前任作品是基于sustainsys示例应用程序“ SampleOwinApplication”的,这似乎确实提供了我们所需的功能。因此,我的查询基于可以从https://github.com/Sustainsys/Saml2

获得的示例

这可与sustainsys saml存根一起使用,但现在是真正的身份验证提供程序(在本例中为Okta)

如果我将应用程序配置为使用sustainsys存根身份验证提供程序,并使用带有插件的Chrome来查看SAML令牌。我可以看到SAML令牌返回并按预期方式显示在回叫中:

    public async Task<ActionResult> ExternalLoginCallback(string returnUrl)
    {
        var loginInfo = await AuthenticationManager.GetExternalLoginInfoAsync();

,并且在运行时,loginInfo会被归档,并且所有工作均会正常进行。

但是,当我更改配置以使用我的Okta应用程序时,我被重定向到登录Okta(如预期的那样),并且可以看到成功的身份验证和SAML令牌返回到我的应用程序(如Chrome插件所示) 。但是,上述用于回调的使用者最终在loginInfo中以null值结尾。

进一步挖掘问题表明,Statup.Auth.cs中包含以下代码:

        // Enable the application to use a cookie to store information for the signed in user
        // and to use a cookie to temporarily store information about a user logging in with a third party login provider
        // Configure the sign in cookie
        app.UseCookieAuthentication(new CookieAuthenticationOptions
        {
            AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
            LoginPath = new PathString("/Account/Login"),
            Provider = new CookieAuthenticationProvider
            {
                // Enables the application to validate the security stamp when the user logs in.
                // This is a security feature which is used when you change a password or add an external login to your account.  
                OnValidateIdentity = SecurityStampValidator.OnValidateIdentity<ApplicationUserManager, ApplicationUser>(
                    validateInterval: TimeSpan.FromMinutes(30),
                    regenerateIdentity: (manager, user) => user.GenerateUserIdentityAsync(manager))
            }
        });
        app.UseExternalSignInCookie(DefaultAuthenticationTypes.ExternalCookie);

然后添加Saml2身份验证

        app.UseSaml2Authentication(CreateSaml2Options());

因此,似乎正在使用cookie身份验证,而不是saml2。如果我从sustainsys站点检查cookie,则可以看到它们已添加到浏览器中,并且身份验证按预期进行。但是,如果我使用Okta进行身份验证,则不会设置此类Cookie,并且身份验证将失败。

删除所有cookie身份验证引用将导致: 在IAppBuilder属性中找不到SignInAsAuthenticationType的默认值。如果您以错误的顺序添加了身份验证中间件,或者缺少身份验证中间件,则会发生这种情况。

因此很明显这是必需的,将调用转移到app.UseSaml2Authentication(CreateSaml2Options());在app.UseCookieAuthentication之前,徒劳地希望它更改优先级,因此获取SAML令牌失败,并且代码运行身份验证并且对AuthenticationManager.GetExternalLoginInfoAsync的调用始终导致返回空值,而与身份验证提供程序无关。 / p>

所以我要么需要完全删除cookie身份验证,否则就被迫使用saml数据包,让Okta设置必要的cookie,或者能够独立解析saml 2令牌,而不是依靠AuthenticationManager.GetExternalLoginInfoAsync来执行工作。

任何线索/建议都值得赞赏

1 个答案:

答案 0 :(得分:0)

请参阅我目前正在Okta成功使用的工作配置,以用于服务提供商启动的登录:

AuthenticateResult.Succeeded is false with Okta and Sustainsys.SAML2

不幸的是,它仍然不能与身份提供商启动的登录一起使用。 参见:IdP Initiated Login with Sustainsys.SAML2 - AuthenticateResult Has No Information