c# - 如何检查 cookie 是否存在,即使它是在另一个应用程序中创建的? (使用 JS 或 C#)

标签 c# javascript asp.net-mvc-3 cookies httpcookie

我有几个应用程序,其中一个是管理身份验证的中央应用程序,其中一个 LogOn 页面作为 IFrame 导入到其他应用程序。

userNamepassword 正确时,我创建一个名为 userInfo 的 cookie。

现在,在当前应用程序中,我想检查 userInfo 的 cookie 是否存在。我想我应该检查它是否存在于浏览器中(在客户端)。

这一定是可能的,那我该怎么做呢?

提前致谢。

最佳答案

Cookie 不能跨域共享。如果您的应用程序不在同一个域中,您必须忘记这一点。它不会工作,因为浏览器(出于明显的安全原因)不会跨域发送 cookie。还有其他方法可以实现跨域单点登录(参见我的回答的第二部分)。

现在让我们假设您的应用程序位于同一个域中,并且您有多个应用程序分布在根域的不同子域中:

  • 登录.foo.com
  • app.foo.com
  • xxx.foo.com

并且您想在这些子域之间共享身份验证。您所要做的就是指定将 web.config 中的 domain 属性设置为根域:

<authentication mode="Forms">
  <forms
    loginUrl="https://login.foo.com"
    requireSSL="true"
    protection="All"
    timeout="120"
    domain="foo.com"
    slidingExpiration="false"
    name="sso" />
</authentication>

相同的配置应该应用于所有应用程序的 web.config。这几乎就是您需要做的全部。一旦用户在其中一个子域上通过身份验证,他将自动在其他子域上进行身份验证,这要归功于 cookie 可以跨子域共享这一事实。


如果要实现跨域单点登录,就得另辟蹊径了。您可以使用相同的 machine keys在不同的应用程序之间加密身份验证 token 。以下是步骤:

  1. 用户导航到 https://foo.com 并显示登录屏幕,因为他尚未在此域上进行身份验证。
  2. 用户进行身份验证并发出身份验证 cookie,该 cookie 对 foo.com 域有效。
  3. 现在用户需要转到 https://bar.com 并在此域上自动进行身份验证。在 https://foo.com 的某些页面上,您可以创建一个包含要发布的身份验证 cookie 值的表单:

    <form action="https://bar.com" method="post">
        <input type="hidden" name="token" value="PUT THE VALUE OF THE AUTHENTICATION COOKIE HERE" />
        <button type="submit">Go to bar.com</button>
    </form>
    
  4. 用户将身份验证 cookie 提交到 bar.com。接收此表单提交的脚本读取发布的身份验证 token 值并使用 FormsAuthentication.Decrypt方法解密身份验证票并读取用户名。由于 foo.combar.com 上的两个应用程序使用相同的机器 key ,因此在 foo.com 上加密的票将被 bar.com 成功解密<
  5. bar.com 的脚本从 token 中提取了经过身份验证的用户名,它使用 FormsAuthentication.SetAuthCookie 发出在 bar.com 上有效的表单例份验证 cookie。方法。
  6. 用户现已在 bar.com 上通过身份验证

此模型的整个安全性依赖于将表单例份验证 token 从 foo.com 发布到 bar.com 时使用 SSL 的事实,因此 token 不能被 man-in-the-middle 捕获并且两个应用程序共享相同的机器 key 来加密和解密这些 token 。

关于c# - 如何检查 cookie 是否存在,即使它是在另一个应用程序中创建的? (使用 JS 或 C#),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10997715/

相关文章:

c# - EventLogSession.ExportLogAndMessages 查询

c# - System.DllNotFoundException 在客户端的 PC 中单击一次部署

php - 尝试使用 mod_rewrite 获取通用的 php/javascript 库

css - MVC Webgrid,是否可以将 css 样式添加到单个列标题?

asp.net-mvc-3 - GZip system.web.优化包

javascript - jquery删除导致mvc3 post失败

c# - 没有 UI 线程的任务同步

c# - Mailgun 使用 RestSharp 发送附件

javascript - 延迟在 IE 11 上保存 session 变量?

javascript - JavaScript onclick需要两次单击