混合Windows / Forms身份验证跨站点

时间:2014-03-04 17:32:34

标签: asp.net authentication

我在ASP.net中设置了两个面向互联网的网站:example.comsite1.example.com

每个部署在不同地理位置的自己的服务器上。

site1.example.com

  • 托管第三方应用程序
  • 使用Windows身份验证表单(本地Windows用户)
  • 我有完整的服务器访问权限。
  • 我只能修改配置/视图代码(我无法修改二进制文件)

example.com

  • 我可以更改的所有自定义代码
  • 对数据库进行表单身份验证

需要做的是

  1. 用户登录example.com
  2. 从数据库中检索Windows凭据(基于当前登录的用户)
  3. 用户在后台使用site1.example.com进行身份验证
  4. example.com指向site1.example.com
  5. 上的资源
  6. 用户现在可以访问site1.example.com
  7. 上的资源

    我已经创建了这个hack以使其工作:

    1. 将加密的凭据附加到site1.example.com登录网址
    2. example.com上创建指向特殊登录网址的隐藏iFrame。
    3. site1.example.com登录页面修改为
      • 解密登录凭据
      • 将其输入用户名/密码框,然后点击通过JavaScript提交
    4. 最终发生的事情是site1.example.com必须在资源可用之前加载两次(一次显示登录页面,一次在页面提交后),这可能需要一些时间。

      有没有办法让example.com在单个请求中在后台使用site1.example.com进行身份验证(与我现在正在执行的两个请求相关)?

      Impersonate Identity似乎在site1.example.com方面很有希望,但如果我从视图中运行它,它的代码实现是否有效?

      Federated Identity似乎是这里的关键,但它是非常压倒性的。我可以在不修改二进制文件的情况下实现它(示例)吗?它是否适用于表单和Windows身份验证的混合,或者它是否允许Windows用户跨不同的Windows域进行链接。

1 个答案:

答案 0 :(得分:1)

您可以在example.com中创建一个在site1.example.com中有效的表单身份验证票证(在Cookie中)。如果为根域创建了cookie,则每个子域都可以读取cookie。

必须将cookie设置为root域,并且两个应用程序必须共享cookie名称,cookie路径和登记密钥。

example.com用户通过身份验证时:

的web.config:

 <machineKey validation="AES" validationKey="C50B3C89CB21F4F1422FF158A5B42D0E8DB8CB5CDA1742572A487D9401E3400267682B202B746511891C1BAF47F8D25C07F6C39A104696DB51F17C529AD3CABE" decryption="AES" decryptionKey="8A9BE8FD67AF6979E7D20198CFEA50DD3D3799C77AF2B72F"/> //key to encrypt auth ticket

在codebehind中:

Dim sTicketEncriptado As String
Dim authTicket As New FormsAuthenticationTicket(1, userName, Date.Now, Date.Now.AddMinutes(timeOut), True, "")
encriptedTicket = FormsAuthentication.Encrypt(authTicket)
Dim authcookie As New HttpCookie("authCookieForSite1", encriptedTicket )
authcookie.HttpOnly = True
authcookie.Domain = example.com" //root domain, every subdomain can read this cookie
authcookie.Path = "/" 
Response.Cookies.Add(authcookie)

site1.example.com中,只需使用表单配置来读取身份验证cookie:

<machineKey validation="AES" validationKey="C50B3C89CB21F4F1422FF158A5B42D0E8DB8CB5CDA1742572A487D9401E3400267682B202B746511891C1BAF47F8D25C07F6C39A104696DB51F17C529AD3CABE" decryption="AES" decryptionKey="8A9BE8FD67AF6979E7D20198CFEA50DD3D3799C77AF2B72F"/> //key to decrypt auth tichet. Same machine keys that in example.com

<forms protection="All" path="/" domain="example.com" timeout="1439" enableCrossAppRedirects="true" cookieless="UseCookies" slidingExpiration="true" loginUrl="example.com" name="authCookieForSite1" defaultUrl="site1.example.com/default.aspx"/> //no login urt, go to example.com if no cookie is present

我是这样做的。很抱歉,如果您遇到错误,但我相信您会明白这一点。