Asp.net mvc 3 如何修复Shibboleth的SAML SSO后的浏览器后退按钮问题

Asp.net mvc 3 如何修复Shibboleth的SAML SSO后的浏览器后退按钮问题,asp.net-mvc-3,postback,back-button,saml,shibboleth,Asp.net Mvc 3,Postback,Back Button,Saml,Shibboleth,在.NETMVC(3)上构建SAML2服务提供商web应用程序。我们使用ComponentSpace的SAML2库进行身份验证,而不是Shibboleth SP。以下是相关控制器逻辑: public class SignOnController : Controller { // constructor-inject _services [HttpPost] public ActionResult SendAuthnRequest(string userName, st

在.NETMVC(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的实现中配置的吗?

所以我知道您在IdP I WBSSO SAML2配置文件中进行身份验证时按下了“后退”按钮?我不知道您列举的组件,但在Shibboleth的情况下,它总是以错误页结束。我可能是错的,但是如果你考虑SP->IDP通信的性质,我相信没有其他的选择,除非你重新实现某些东西。

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

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

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


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

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


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

我们使用这个脚本。它检查主url是否从SSO重定向调用。如果是这样,当用户单击后退按钮时,它将跳过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));

否,在IdP身份验证后点击后退按钮。在后退按钮问题出现之前,用户已经在我们的SP应用程序中。问得好。你找到解决办法了吗?我也在处理同样的问题。@BryceH,不幸的是,没有。不过你可以在这个问题上悬赏,看看其他人是否知道什么。