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

Par*_*Par 3 javascript c# cookies httpcookie asp.net-mvc-3

我有几个应用程序,其中一个是管理身份验证的中央应用程序,以及将LogOn页面作为IFrame其他应用程序导入的位置.

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

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

它必须是可能的,所以我该怎么做呢?

提前致谢.

Dar*_*rov 9

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

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

  • login.foo.com
  • app.foo.com
  • xxx.foo.com

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

<authentication mode="Forms">
  <forms
    loginUrl="https://login.foo.com"
    requireSSL="true"
    protection="All"
    timeout="120"
    domain="foo.com"
    slidingExpiration="false"
    name="sso" />
</authentication>
Run Code Online (Sandbox Code Playgroud)

应对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>
    
    Run Code Online (Sandbox Code Playgroud)
  4. 用户将身份验证cookie提交给bar.com.接收此表单提交的脚本将读取已发布的身份验证令牌值,并使用该FormsAuthentication.Decrypt方法解密身份验证票证并读取用户名.由于在这两个应用程序foo.com,并bar.com使用相同的机键,这是在foo.com加密的票据将被成功解密bar.com
  5. bar.com从令牌中提取经过身份验证的用户名的脚本,它会在bar.com使用该FormsAuthentication.SetAuthCookie方法时发出有效的表单身份验证cookie .
  6. 用户现在已通过身份验证 bar.com

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