加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

asp.net – 混合Windows / Forms身份验证跨站点

发布时间:2020-12-16 09:40:16 所属栏目:asp.Net 来源:网络整理
导读:我在ASP.net中编写了两个面向互联网的站点:example.com和site1.example.com 每个部署在不同地理位置的自己的服务器上. site1.example.com 托管第三方应用程序 使用窗口身份验证表单(本地Windows用户) 我有完整的服务器访问权限. 我只能修改配置/视图代码(我
我在ASP.net中编写了两个面向互联网的站点:example.com和site1.example.com

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

site1.example.com

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

example.com

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

需要做的是

>用户登录example.com
>从数据库中检索Windows凭据(基于当前登录的用户)
>用户在后台使用site1.example.com进行身份验证
> example.com链接到site1.example.com上的资源
>用户现在可以访问site1.example.com上的资源

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

>将加密的凭据附加到site1.example.com登录URL
>在example.com上创建指向特殊登录URL的隐藏iFrame.
>将site1.example.com登录页面修改为

>解密登录凭据
>将它们输入用户名/密码框,然后单击通过JavaScript提交

最终发生的是site1.example.com必须加载两次才能获得资源(一次显示登录页面,一次在页面提交后),这可能需要一些时间.

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

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

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

解决方法

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

必须将cookie设置为根域,并且两个应用程序必须共享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

我是这样做的.对不起,如果你遇到错误,但我相信你会明白的.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读