1

我已经搜索(甚至)搜索了这个问题的答案,但到目前为止还没有找到任何有用的东西。我对 ADFS、STS 和 WIF 还是很陌生,所以请原谅任何明显的无知或不当使用术语。;)

我目前正在通过 ADFS 将自定义 MVC3 应用程序与外部 IdP 集成。ADFS 到 IdP 的设置已全部完成并正常工作。

该站点的某些部分可供匿名用户访问 - 在 web.config 身份验证模式中已设置为无。其他部分通过自定义 System.Web.Mvc.AuthorizeAttribute 修饰其控制器/操作方法来保护。

为使用 WsFederationAuthenticationModule 对 web.config 进行了所有常见的修改,并且它可以工作 95%;用户可以浏览到网站的匿名访问部分。当他们尝试访问受保护的部分时,授权属性会检查他们是否在与 HttpContext.Current.User 关联的 IClaimsPrincipals 中从我们的 IdP 获得了一些自定义信息,如果没有,则将 ActionResult 设置为 401;WsFederationAuthenticationModule 启动并将它们重定向到 IdP 的登录页面。当他们输入他们的详细信息时,他们会被一些 FedAuth cookie 成功重定向,然后授权就会通过。

当他们到达 IdP 的登录页面时,问题就开始了。这个特定的 IdP 有一个链接,可将您直接返回到我们的网站(返回到原始请求所发到的同一页面),并在某处嵌入此 SAML 响应(这是根据他们的文档)

瓮:绿洲:名称:tc:SAML:2.0:状态:AuthnFailed

在这一点上,它们现在是“未经授权的”,所有用户将看到(至少在开发中)是一个 401 页面。您必须终止会话或以其他方式摆脱该 cookie 才能重新开始。

我需要做的是拦截来自 IdP 的重定向请求,并从本质上检查该特定 SAML 状态,因为然后用户应该被重定向到未经授权的区域之一,就好像什么都没发生一样。我在 global.asax 中尝试过这样的事情:

 protected void Application_Start()
    {
        // mvc stuff here....

        // add handler to intercept handling creation of security tokens by WsFederationAuthnticationModule
        FederatedAuthentication.ServiceConfigurationCreated += OnServiceConfigurationCreated;
    }

    void OnServiceConfigurationCreated(object sender, ServiceConfigurationCreatedEventArgs e)
    {
        FederatedAuthentication
            .WSFederationAuthenticationModule
            .SessionSecurityTokenCreated += WSFederationAuthenticationModule_SecuityTokenCreated;
    }

    public void WSFederationAuthenticationModule_SecuityTokenCreated (Object sender, SessionSecurityTokenCreatedEventArgs args) 
    {          
        var token = args.SessionToken;
        // do something with the session token here e.g. check for SAML status
    }

..但我在那个令牌上看不到任何有用的东西;没有任何东西表明特定的响应状态。根本有一个 FedAuth cookie但没有来自 Idp 的自定义信息这一事实完全表明用户已经在那里但不知何故未能进行身份验证,但原则上我希望能够看到该状态。我可能还必须处理 IdP 的超时问题......

也许我做错了,或者只是老不明白,但可以以某种方式让我了解如何确定这些响应状态?

呸。谢谢!:D

4

1 回答 1

2

好的,所以我要回答我自己的问题。

目前,我是否可以从 IdP 获得该自定义状态的答案是否定的。:(

但这仅仅是因为 ADFS 没有设置为捕获并传递它。显然,您需要进行一些自定义编码,以从 ADFS 和 IdP 之间打开的反向通道捕获信息......远远超出了当前的工作范围。

作为目前的解决方法:

  • 如果向站点发出请求并且没有 SAML 令牌,则它是由未对 Idp 进行身份验证尝试的用户提出的新请求
  • 如果令牌中有 SAML 令牌但没有来自 IdP 的 ID(仅当他们正确身份验证时才存在),则用户由于某种原因未能通过身份验证
    • 如果存在带有 ID 的 SAML 令牌,则用户已正确验证

不是很好但可以接受。顺便说一句,此SO帖子中的所有功劳归于 YMC ,以获取以下代码,您可以通过该代码检查 SAML 令牌:

void WSFederationAuthenticationModule_SecurityTokenReceived(object sender, SecurityTokenReceivedEventArgs e)
    {
        var message = SignInResponseMessage.CreateFromFormPost(Request) as SignInResponseMessage;
        var rstr = new WSFederationSerializer()
            .CreateResponse(message,
            new WSTrustSerializationContext(
                SecurityTokenHandlerCollectionManager.CreateDefaultSecurityTokenHandlerCollectionManager()));
    } 

个人电脑!

于 2012-03-13T01:55:24.520 回答