web-dev-qa-db-ja.com

サブドメイン間でASP.NET Cookieを共有する

2つのサイトがあり、両方とも同じドメインにありますが、サブドメインは異なります。
site1.mydomain.com site2.mydomain.com

それぞれで認証されると、後続のリクエストに含まれるCookieを確認します。これらは各サイトで同一です。

ただし、最初のサイトにログインしてから他のサイトに移動すると、サイト1からのCookieがリクエストとともにsite2に送信されると予想されますが、そうではありません。ここに私のクッキーのプロパティがあります。

Site1にログインすると、このCookieが存在します

Name = MySite 
Domain = 
Has Keys = False 
HttpOnly = False 
Path = / 
Value = 1C41854066B03D8CC5679EA92DE1EF427DAC65D1BA0E672899E27C57245C1F0B7E93AB01B5563363AB4815A8F4BDE9D293FD261E03F8E60B8497ABBA964D8D315CCE1C8DD220C7176E21DC361935CF6 
Expires = 1/1/0001 12:00:00 AM 

Site2にログインすると、これらのCookieが存在します。

Name = MySite 
Domain = 
Has Keys = False 
HttpOnly = False 
Path = / 
Value =    C8C69F87F993166C4D044D33F21ED96463D5E4EB41E1D986BF508DA0CBD5C2CA7D782F59F3BC96871108997E899FF7401C0D8615705BDB353B56C7E164D2302EE6731F41705016105AD99F4E0578ECD2 
Expires = 1/1/0001 12:00:00 AM 

それぞれにドメインを設定しました(クライアントでのみ必要なため、リクエストCookieには表示されません)。それぞれのフォーム設定が同一であることを確認し、マシンキー設定が両方のWeb設定で同一であることを確認しました。

なぜこれが機能しないのか迷っています。私が知る限り、クライアントが同じ認証Cookieを両方使用している場合、クライアントが1つのサブドメインに送信し、もう1つのサブドメインに送信しないということは、Cookieに何が含まれていますか?

ご覧になりたい情報がある場合はコメントしてください。私はこれに二日間苦労しています。 この記事 によると、これは機能するはずです。

UPDATE:コードが追加されました

ここに私の認証のための私の設定ファイルの設定があります。これは両方のサイトで使用されます。

<authentication mode="Forms">
    <forms loginUrl="~/Account/LogOn"
       defaultUrl="~/Home/Index"
       name="MySite" 
       protection="All" 
       path="/" 
       domain="mydomain.com" 
       enableCrossAppRedirects="true" 
       timeout="2880" 
/>

そして、これがSite1でCookieを作成するための私のコードです。

//Add a cookie that the Site2 will use for Authentication
var cookie = FormsAuthentication.GetAuthCookie(userName, true);
cookie.Name = "MySite";
cookie.HttpOnly = false;
cookie.Expires = DateTime.Now.AddHours(24);
cookie.Domain = "mydomain.com"; 
HttpContext.Response.Cookies.Add(cookie);
HttpContext.Response.Redirect(site2Url,true);

更新2:

テスト中に奇妙なことに気づきました。 cookieをsite1の応答に追加すると、このディレクトリに追加されます... C:\ Users\jreddy\AppData\Roaming\Microsoft\Windows\Cookies

サイトの応答にCookieを追加すると、このディレクトリに追加されます... C:\ Users\jreddy\AppData\Roaming\Microsoft\Windows\Cookies\Low

それが私の問題かもしれません。自分のサイトの1つがローカルイントラネットゾーンに含まれている可能性がありますか?

更新3:問題が見つかりました、解決方法が不明です私の問題は、ローカルイントラネットゾーンの一部である2番目のサイトに関係しているようです。 Firefoxを使用してSite1にアクセスすると機能しますが、Windowsの資格情報を入力する必要があります。 IEを使用すると、資格情報は自動的に取得されますが、cookieはsite2で読み取ることができません。別の質問でこれを尋ねるかもしれません。

30
Jeff Reddy

2つのサブドメインWebサイトの各Cookieで、ドメインのプロパティを「.mydomain.com」に設定します

お気に入り

Response.Cookies["test"].Value = "some value";
Response.Cookies["test"].Domain = ".mysite.com";

更新1

サイト内

HttpCookie hc = new HttpCookie("strName", "value");
hc.Domain = ".mydomain.com"; // must start with "."
hc.Expires = DateTime.Now.AddMonths(3);
HttpContext.Current.Response.Cookies.Add(hc);

サイトB

HttpContext.Current.Request.Cookies["strName"].Value

それを試してみてください

よろしく

16
Mhmd

新しいCookieを追加し、次のようにドメインを指定します

HttpCookie cookie = new HttpCookie("cookiename", "value");
cookie.Domain = "domain.com";

フォーム認証の場合、web.configでこれを設定します

<forms name=".ASPXAUTH" 
       loginUrl="login.aspx" 
       protection="All" 
       timeout="30" 
       path="/" 
       requireSSL="false" 
       domain="domain.com">
</forms>

Cookieはすべてのサブドメインからアクセス可能です。

各ドメインでCookieを復号化するには、すべてのweb.configファイルで同じ暗号化/復号化アルゴリズムとキーを使用する必要があります。 ( マシンキーの作成方法

例:

// do not wrap these values like this in the web.config
// only wrapping for code visibility on SO
<machineKey  
  validationKey="21F090935F6E49C2C797F69BBAAD8402ABD2EE0B667A8B44EA7DD4374267A75
                 D7AD972A119482D15A4127461DB1DC347C1A63AE5F1CCFAACFF1B72A7F0A281
                 B"             
  decryptionKey="ABAA84D7EC4BB56D75D217CECFFB9628809BDB8BF91CFCD64568A145BE59719
                 F"
  validation="SHA1"
  decryption="AES"
/>

展開を容易にするために、これらの値を別のファイルに保存できます。

<machineKey configSource="machinekey.config"/>

セキュリティを強化するために、マシンキーを暗号化してさらに保護することもできます。

9
Prasanth

すべてのサブドメインでフォーム認証を使用している場合は、domain=".mydomain.com"プロパティを<forms>web.configノードに追加するだけです

.mydomain.comの先頭の期間に注意してください

この単純な変更自体により、認証Cookieがすべてのサブドメインで有効になります。 Cookieを手動で設定する必要はありません。

4
roman m

サブドメインの安全なCookieを書き込むHttpContext拡張メソッドを作成しました。

ブログの投稿とディスカッション

public static class HttpContextBaseExtenstions
{
    public static void SetSubdomainSafeCookie(this HttpContextBase context, string name, string value)
    {
        var domain = String.Empty;

        if (context.Request.IsLocal)
        {
            var domainSegments = context.Request.Url.Host.Split('.');
            domain = "." + String.Join(".", domainSegments.Skip(1));
        }
        else
        {
            domain = context.Request.Url.Host;
        }

        var cookie = new HttpCookie(name, value)
        {
            Domain = domain
        };

        context.Response.SetCookie(cookie);
    }
}

// usage
public class MyController : Controller
{
    public ActionResult Index()
    {
        this.Context.SetSubdomainSafeCookie("id", Guid.NewGuid().ToString());
        return View();
    }
}
1
Nick