23

是否有以下可用的体面示例:

查看WIF SDK,有一些将 WIF 与 ASP.NET 结合使用的示例,使用WSFederationAuthenticationModule (FAM)ASP.NET 网站在用户用来进行身份验证的安全令牌服务 (STS) 之上的瘦皮肤(通过提供用户名)和密码)。

如果我正确理解 WIF 和基于声明的访问,我希望我的应用程序提供自己的登录屏幕,用户在其中提供用户名和密码,并让这个委托给 STS 进行身份验证,通过安全标准将登录详细信息发送到端点(WS-*),并期望返回 SAML 令牌。理想情况下,SessionAuthenticationModule将按照示例FAMSessionAuthenticationModuleie 一起使用,即负责IClaimsPrincipal从会话安全分块 cookie 重建并在安全会话到期时重定向到我的应用程序登录页面。

我所描述的是否可以使用FAMSessionAuthenticationModule使用适当的 web.config 设置,还是我需要考虑自己编写一个HttpModule来处理这个问题?或者,是否重定向到用户在被动请求者场景中登录事实上的方法的瘦网站 STS?

4

5 回答 5

19

“Claims Identity Guide”的本章提供了 WIF + MVC 的示例:

http://msdn.microsoft.com/en-us/library/ff359105.aspx

我确实建议阅读前几章以了解所有基本原则。这篇博文涵盖了 MVC + WIF 的细节:

http://blogs.msdn.com/b/eugeniop/archive/2010/04/03/wif-and-mvc-how-it-works.aspx

控制登录体验非常好。您应该只部署自己的 STS(在您的域中,使用您的外观等)。您的应用程序将简单地依赖它进行 AuthN(这就是为什么应用程序通常被称为“依赖方”)。

该架构的优点是 authN 被委托给 1 个组件(STS),而不是分散在许多应用程序中。但另一个(巨大的)优势是您可以非常轻松地启用更复杂的场景。例如,您现在可以与其他组织的身份提供者联合。

希望它可以帮助尤金尼奥

@新星:

令牌(包含声明)可以选择加密(否则它们将是明文)。这就是为什么始终建议将 SSL 用于浏览器和 STS 之间的交互。

请注意,即使它们是明文形式,也无法篡改,因为令牌是经过数字签名的。

于 2010-05-25T16:05:52.633 回答
13

这是你问的一个有趣的问题。我知道无论出于何种原因,微软在没有太多文档的情况下推出了这个“Windows Identity Foundation”框架。我知道这一点是因为我的任务是弄清楚如何将它用于新项目并将其与现有基础架构集成。我已经在网上搜索了几个月寻找好的信息。

我采取了不同的角度来解决您描述的问题。

我采用了一个现有的登录应用程序并将 Microsoft 的 WIF 管道集成到其中。我的意思是我有一个用户登录的应用程序。登录应用程序将用户提供的凭据提交到另一个服务器,该服务器返回用户身份(或指示登录失败)。

查看 Microsoft 的一些示例,我看到它们执行以下操作:SignInRequestMessage从查询字符串(由依赖方应用程序生成)构造 a,从自定义类构造安全令牌服务,最后使用当前 httpcontext 调用 FederatedSecurityTokenServiceOperations.ProcessSignInresponse。回复。不幸的是,我不能在这里很好地解释它;您确实需要查看代码示例。

我的一些代码与代码示例非常相似。您将对实现很多自己的逻辑感兴趣的地方是GetOutputClaimsIdentity. 这是构造描述登录用户的声明身份的函数。

现在,这就是我认为您真正有兴趣了解的内容。这是微软在他们的文档 AFAIK 中没有告诉你的。

一旦用户登录,他们就会被重定向回依赖方应用程序。不管登录应用程序如何工作,WIF 类都会向用户的浏览器发送一个响应,其中包含一个“隐藏的”HTML 输入,其中包含令牌签名证书和用户的声明。(声明将采用明文形式)。在此响应的末尾是重定向到您的依赖方网站。我只知道这个动作,因为我用“Fiddler”捕获了它

返回依赖方网站后,WIF 类将处理响应(在您的任何代码运行之前)。证书将被验证。默认情况下,如果您已使用 FedUtil.exe 设置您的信赖方网站(通过在 Visual Studio 中单击“在您的信赖方应用程序中添加 STS 引用),Microsoft 的类将验证证书指纹。

最后,WIF 框架在用户浏览器中设置包含用户声明的 cookie(根据我的经验,cookie 名称以“FedAuth”开头)。cookie 不是人类可读的。

一旦发生这种情况,您可以选择使用ClaimsAuthenticationClass. 这是您的代码再次运行的地方。

我知道这与您所描述的不同,但我有这个设置工作。我希望这有帮助!

附言。请查看我就 Windows Identity Foundation 提出的其他问题。

更新:在下面的评论中回答问题:

我遗漏的一件事是重定向到 STS 登录应用程序是通过使用包含用户正在登录的应用程序 URL 的查询字符串的重定向发生的。当用户第一次尝试访问需要身份验证的页面时,此重定向会自动发生。或者,我相信您可以使用WSFederationAuthentication模块手动进行重定向。

我从未尝试过这样做,但如果您想在应用程序本身中使用登录页面,我相信该框架应该允许您使用以下内容:

1) 将您的 STS 代码封装在库中。2) 从您的应用程序中引用该库。3) 在您的应用程序中创建一个登录页面。确保此类页面不需要身份验证。4) 将web.config 部分中wsFederation元素的 issuer 属性设置为登录页面。Microsoft.IdentityModel

于 2010-04-19T19:33:53.410 回答
4

您要做的是主动登录。WIF 包括WSTrustChannel(Factory),它允许您直接与 STS 通信并获取安全令牌。如果您希望您的登录表单以这种方式工作,您可以遵循 WIF 4.0 SDK 中的“WSTrustChannel”示例。获得令牌后,以下代码将获取该令牌并调用 WIF 处理程序以创建会话令牌并设置适当的 cookie:

public void EstablishAuthSession(GenericXmlSecurityToken genericToken)
{
    var handlers = FederatedAuthentication.ServiceConfiguration.SecurityTokenHandlers;            
    var token = handlers.ReadToken(new XmlTextReader(
                                        new StringReader(genericToken.TokenXml.OuterXml)));

    var identity = handlers.ValidateToken(token).First();
    // create session token
    var sessionToken = new SessionSecurityToken(
        ClaimsPrincipal.CreateFromIdentity(identity));
    FederatedAuthentication.SessionAuthenticationModule.WriteSessionTokenToCookie(sessionToken);
}

完成此操作后,您的站点的行为应该与发生被动签名时相同。

于 2010-06-29T17:47:10.503 回答
1

您可以使用 FederatedPassiveSignIn 控件。

于 2010-08-26T11:52:47.680 回答
0

像这样设置你的cookie:FederatedAuthentication.SessionAuthenticationModule.WriteSessionTokenToCookie(sessionToken); 不适用于 SSO 到其他域。

To cookie 应由 STS 而非 RP 设置。

于 2011-05-16T18:39:10.340 回答