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

4
我有两个使用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. 现在用户可以访问 site1.example.com 上的资源

我创建了此黑客来使其工作:

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

有没有一种方法可以让 example.com 通过单个请求在后台与 site1.example.com 进行身份验证(而不是现在所做的两个请求)?

模拟身份site1.example.com 端看起来很有前途,但如果我从视图运行它,它的代码实现是否有效?

联合身份 似乎是关键,但它非常令人不知所措。我能否在不修改一个端点上的二进制文件的情况下实现它(例如示例)?它是否支持混合表单和 Windows 身份验证,或者只允许 Windows 用户在不同的 Windows 域之间建立链接?"


你是在使用AD(Active Directory)进行身份验证吗?还是使用基于哈希用户凭据的数据库进行FormsAuthentication,该数据库在两个不同位置之间进行同步(因此我们忽略您“本地Windows用户”的选择)?或者? - Ted
@Ted example.com:使用哈希凭据的FormsAuthentication。site1.example.com:具有不同于example.com的用户。使用Windows身份验证的Forms。我猜它是AD。 - user1886419
也许跨应用程序的表单身份验证可以起作用,但前提是 Web farm 可以由不同供应商的两个不同服务器组成。更多信息:http://msdn.microsoft.com/en-us/library/eb0zx8fc%28v=vs.100%29.aspx 因此,我不确定如何解释 Web farm。 - jyrkim
1个回答

1
你可以在example.com中创建一个表单身份验证票证(以cookie形式),该票证将在site1.example.com中有效。如果将cookie创建到根域,则每个子域都可以读取cookie。
cookie必须设置为根域,两个应用程序必须共享cookie名称、cookie路径和加密密钥。
example.com中,当用户通过身份验证时:

web.config:

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

在代码后台:
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

我正在凭借自己的经验来做这件事。如果你遇到错误,请见谅,但我相信你会理解我的意思。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接