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

本文关键字:创建 应用程序 其他 使用 JS cookie 检查 何检查 是否 存在 | 更新日期: 2023-09-27 18:36:50

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

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

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

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

提前谢谢。

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

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

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

  • login.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 可以跨子域共享。


如果要实现跨域单点登录,则必须采用不同的方法。您可以在不同的应用程序之间使用相同的计算机密钥来加密身份验证令牌。以下是步骤:

  1. 用户导航到https://foo.com并显示登录屏幕,因为他尚未在此域上进行身份验证。
  2. 用户进行身份验证,并发出身份验证 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。接收此表单提交的脚本读取已发布的身份验证令牌值,并使用 FormsAuthentication.Decrypt 方法解密身份验证票证并读取用户名。由于 foo.combar.com 上的应用程序使用相同的计算机密钥,因此在 foo.com 上加密的票证将由 bar.com 成功解密
  5. 脚本bar.com从令牌中提取经过身份验证的用户名后,它会发出一个表单身份验证 cookie,该 cookie 在使用 FormsAuthentication.SetAuthCookie 方法bar.com上有效。
  6. 用户现在已通过身份验证bar.com

此模型的整个安全性依赖于以下事实:在将表单身份验证令牌从 foo.com 发布到 bar.com 时使用 SSL,因此中间人无法捕获令牌,并且两个应用程序共享相同的计算机密钥来加密和解密这些令牌。