首页 文章

ASP.NET MVC 2和使用WIF进行身份验证(Windows Identity Foundation)

提问于
浏览
23

是否有以下可用的例子:

浏览 the WIF SDK ,有一些使用WIF与ASP.NET结合的示例,使用 WSFederationAuthenticationModule (FAM) 重定向到用户用来进行身份验证的安全令牌服务(STS)之上的ASP.NET站点瘦皮肤(通过提供用户名和密码) .

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

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

5 回答

  • 19

    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),而不是遍布许多应用程序 . 但另一个(巨大的)优势是您可以非常轻松地启用更复杂的场景 . 例如,您现在可以与其他组织的身份提供商联合 .

    希望它有助于Eugenio

    @RisingStar:

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

    请注意,即使它们是明文,也不可能进行篡改,因为令牌是经过数字签名的 .

  • 13

    这是你提出的一个有趣的问题 . 我知道无论出于何种原因,微软推出了这个“Windows Identity Foundation”框架而没有太多文档 . 我知道这一点,因为我的任务是弄清楚如何将它与新项目一起使用并将其与现有基础设施集成 . 几个月来我一直在网上寻找好消息 .

    我采取了一个不同的角度来解决你描述的问题 .

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

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

    我的一些代码与代码示例非常相似 . 在 GetOutputClaimsIdentity 中,您将有兴趣实现许多自己的逻辑 . 这是构造描述登录用户的声明标识的函数 .

    现在,我认为你真的很想知道这些 . 这就是微软在他们的文档中没有告诉你的,AFAIK .

    用户登录后,会将其重定向回依赖方应用程序 . 无论登录应用程序如何工作,WIF类都会向用户的浏览器发送一个响应,其中包含一个“隐藏”的HTML输入,其中包含令牌签名证书和用户的声明 . (索赔将以明文形式提出) . 在此回复结束时,重定向到您的依赖方网站 . 我只知道这个动作,因为我 grab 了它与“提琴手”

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

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

    一旦发生这种情况,您可以选择使用 ClaimsAuthenticationClass 在依赖方网站内对用户的声明执行操作 . 这是您的代码再次运行的地方 .

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

    PS . 请查看我提出的有关Windows Identity Foundation的其他问题 .

    UPDATE: To answer question in comment below:

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

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

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

  • 0

    你想要做的是积极的登录 . 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);
    }
    

    完成此操作后,您的网站应该像发生被动签名一样 .

  • 1

    您可以使用FederatedPassiveSignIn控件 .

  • 4

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

    cookie应由STS设置,而不是RP .

相关问题