我已经搜索(甚至)搜索了这个问题的答案,但到目前为止还没有找到任何有用的东西。我对 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