我在ASP.net中设置了两个面向互联网的网站:example.com
和site1.example.com
每个部署在不同地理位置的自己的服务器上。
site1.example.com
example.com
需要做的是
example.com
site1.example.com
进行身份验证example.com
指向site1.example.com
site1.example.com
我已经创建了这个hack以使其工作:
site1.example.com
登录网址example.com
上创建指向特殊登录网址的隐藏iFrame。site1.example.com
登录页面修改为
最终发生的事情是site1.example.com
必须在资源可用之前加载两次(一次显示登录页面,一次在页面提交后),这可能需要一些时间。
有没有办法让example.com
在单个请求中在后台使用site1.example.com
进行身份验证(与我现在正在执行的两个请求相关)?
Impersonate Identity似乎在site1.example.com
方面很有希望,但如果我从视图中运行它,它的代码实现是否有效?
Federated Identity似乎是这里的关键,但它是非常压倒性的。我可以在不修改二进制文件的情况下实现它(示例)吗?它是否适用于表单和Windows身份验证的混合,或者它是否允许Windows用户跨不同的Windows域进行链接。
答案 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
我是这样做的。很抱歉,如果您遇到错误,但我相信您会明白这一点。