【问题标题】:Mixing Windows/Forms Authentication Cross site混合 Windows/Forms 身份验证跨站点
【发布时间】:2014-03-04 17:32:33
【问题描述】:

我在 ASP.net 中编写了两个面向 Internet 的网站:example.comsite1.example.com

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

site1.example.com

  • 托管第三方应用程序
  • 使用窗体进行 Windows 身份验证(本地 Windows 用户)
  • 我拥有完整的服务器访问权限。
  • 我只能修改配置/查看代码(我不能修改二进制文件)

example.com

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

需要发生的是

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

我已经创建了这个 hack 来让它发挥作用:

  1. 将加密凭据附加到site1.example.com 登录网址
  2. example.com 上创建隐藏的 iFrame,指向特殊的登录 url。
  3. 修改site1.example.com登录页面为
    • 解密登录凭据
    • 在用户名/密码框中输入它们并点击通过 JavaScript 提交

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

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

Impersonate Identitysite1.example.com 方面似乎很有希望,但如果我从视图中运行它,它的代码实现会起作用吗?

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

【问题讨论】:

  • 您是否针对 AD (Active Directory) 进行身份验证?或者 FormsAuthentication 针对在两个不同位置之间同步的散列用户凭据数据库(因此我们忽略您的“本地 Windows 用户”)?还是?
  • @Ted example.com:带有散列凭据的 FormsAuthentication。 site1.example.com:与 example.com 有不同的用户。使用窗体进行 Windows 身份验证。我假设它的广告
  • 也许跨应用程序的表单身份验证可以工作,但前提是 Web 场可以拥有由不同提供商提供的两个不同服务器。更多信息:msdn.microsoft.com/en-us/library/eb0zx8fc%28v=vs.100%29.aspx 所以我不确定如何解释网络场。

标签: asp.net authentication


【解决方案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

我正在认真做这件事。抱歉,如果您遇到错误,但我相信您会明白的。

【讨论】:

    猜你喜欢
    • 2011-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-18
    • 2021-05-27
    • 2016-12-24
    • 2020-06-21
    • 1970-01-01
    相关资源
    最近更新 更多