3

在 .NET MVC (3) 上构建 SAML2 服务提供程序 Web 应用程序。我们使用 ComponentSpace 的 SAML2 库进行身份验证,而不是Shibboleth SP。以下是相关的控制器逻辑:

public class SignOnController : Controller
{
    // constructor-inject _services

    [HttpPost]
    public ActionResult SendAuthnRequest(string userName, string returnUrl)
    {
        // this users ComponentSpace internally to push user to IdP
        _services.SamlServiceProvider.SendAuthnRequest(args);
        return new EmptyResult();
    }

    [HttpPost]
    public ActionResult ReceiveAuthnResponse()
    {
        var samlResponse = _services.SamleServiceProvider
            .ReceiveSamlResponse(args);
        // ...
        return Redirect(samlResponse.RelayResourceUrl ?? defaultUrl);
    }
}

最终,用户登陆中继 url 或默认登录页面。但是,当他们单击链接,然后单击返回按钮时,浏览器会返回到 Shibboleth IdP 服务器上的错误页面。在那之后,浏览器的前进和后退按钮最终变得毫无用处。

我在上述任何一种方法中做错了吗?发送时我应该返回 View() 而不是 EmptyResult() 吗?是否有某种方法可以重置浏览器历史记录以防止重复回发回 IdP?这是我可以在 ComponentSpace 的实现中配置的东西吗?

4

4 回答 4

0

所以我知道您在身份验证期间在 IdP i WBSSO SAML2 配置文件中点击了返回按钮?我不知道您列举的组件,但在 Shibboleth 情况下,它总是以错误页面结尾。我可能错了,但是如果您考虑 SP->IdP 通信的性质,我相信没有其他选择,除非您重新实现某些东西。

于 2012-07-20T09:41:12.010 回答
0

通过浏览器发送的 SAML SSO 中使用的 SAML 协议消息。如您所见,在使用 SAML SSO 时单击浏览器的前进和后退导航按钮可能会出现问题。

这个问题没有简单的解决方案。您可以考虑合并 Javascript 来禁用导航按钮,但这很可能会导致其他问题。

我认为最好和最简单的解决方案是在发生这种情况时显示通用错误消息。这是您需要在应用程序中执行的操作。

我们发布的 MvcExampleIdentityProvider 和 MvcExampleServiceProvider 应用程序在大多数情况下都没有问题。他们使用 SAML 高级 API,而不是问题中使用的 SAML 低级 API,但这应该没有什么区别。在我们的示例中,我们也返回一个 EmptyResult。

于 2015-05-09T02:05:18.920 回答
0

我们使用这个脚本。它检查是否从 SSO 重定向调用主 url。如果是这样,它会在用户单击后退按钮时跳过 SSO 页面。如果没有,脚本什么也不做,因为后退按钮按预期工作。

  (function(window, location) {
        var previous = document.referrer.toLowerCase();
        var issso = previous.indexOf('account/sso');
        if(issso >= 0){
            history.replaceState(null, document.title, location.pathname+"#!/skipsso");
            history.pushState(null, document.title, location.pathname);
            window.addEventListener("popstate", function() {
                if(location.hash === "#!/skipsso") {
                    setTimeout(function(){
                        history.go(-2);
                    },0);
                }
            }, false);
        }
    }(window, location));
于 2018-03-12T13:53:10.823 回答
0

我们遇到了同样的问题,并使用 JavaScript 历史 API 解决了这个问题:

https://www.thecssninja.com/javascript/stealing-history-api

这并不好,因为本质上浏览历史是被操纵的。但它可以有效地工作并防止错误页面出现。您的 Web 应用程序中的后退/前进按钮继续正常工作,但用户无法返回到任何不是您的 Web 应用程序的先前页面。这是我们可以接受的妥协。

于 2016-09-19T19:34:09.090 回答