2013-12-14 13 views
27

「WebApplication1」という新しいWebアプリケーションを作成します.WebFormsは認証がIndividual User Accountに設定されています。私は自動生成されたコードテンプレートに1行のコードを追加しません。私はアプリケーションを実行し、ユーザー "User1"を登録してログインしても問題ありません。1つのサイトのASP.NET IDログインが同じマシン上の異なるWebサイトと共有されるのはなぜですか?

今度は別のWebアプリケーション "WebApplication2"を作成します.WebFormsと同じWebFormsで、AuthenticationをIndividual User Accountに設定します。もう一度コードと私はアプリケーションを実行します。今私は "User2"と言う別のユーザーを作成 - うまく動作します。

問題は、両方のアプリケーションが同時に実行されているときに開始されます。 「User1」として最初のサイトにログインした場合、「User1」が登録されていなくても、自動的に「web1」という2番目のサイトのContext.User.Identityが「User1」に設定され、あるサイトからログアウトし、もう1つはログアウトします。

Context.User.Identityがどのように共有されていますか?

コードが全く同じである -

public static void SignIn(UserManager manager, ApplicationUser user, bool isPersistent){ 

     IAuthenticationManager authenticationManager = HttpContext.Current.GetOwinContext().Authentication; 
     authenticationManager.SignOut(DefaultAuthenticationTypes.ExternalCookie); 

     var identity = manager.CreateIdentity(user, DefaultAuthenticationTypes.ApplicationCookie); 
     authenticationManager.SignIn(new AuthenticationProperties() { IsPersistent = isPersistent }, identity); 
    } 

私は確信してASP.Netアイデンティティは非常に私を助けてくださいどのように機能するかについていくつかの基本的な知識が不足しています。

ありがとうございます。

+0

優れた質問と、以下の優れた受け入れ答え。質問タイトルを「質問-ish」という名前に変更することをお勧めします。「1つのサイトのASP.NET IDログインが同じマシン上の異なるWebサイトと共有されるのはなぜですか? (またはそのようなもの...) – Funka

+0

@Funka - あなたの提案に応じて変更された質問。 –

答えて

47

サーバーがCookie認証を使用するように構成されている場合、サーバーはユーザーに対して暗号化され署名されたクレームを含むCookieをブラウザに返します。

このCookieの名前は、デフォルトで.AspNet.ApplicationCookieです。

このクッキーは、有効期限が切れるまで(デフォルトでは14日間、有効期限が切れるまで)ブラウザーに保存されるか、明示的にログアウトしてクッキーを削除します。

同じブラウザタイプの別のタブまたはウィンドウを開いた場合は、ログインした後も同じCookieが使用され、2つのWebサイトのいずれかにリクエストを送信するときに渡されます。

両方のサイトが同じCookie名を探すように設定されている場合、両方のサイトで同じCookie名が検索され、同じマシンを共有するため、認証Cookieを復号化できるようになります。解読し、署名する。クッキーには、同じサーバー内のどのサイトに属しているかを示す情報はありません。そのため、WebApplication1に保存されている「User1」クレームは、WebApplication2で認証されたものと見なされます。 OWIN認証ミドルウェアは、着信要求に有効なCookieがある場合、データベースをチェックしません。クッキー内に提示された暗号化されたクレーム(ユーザー名、ロールなど)を単に使用します。

CookieNameを2つのWebアプリケーションで異なる設定にすると、同じ認証Cookieが使用されないため、あるサイトで認証されたユーザーは他のサイトで認証されません。

あなたはこのようなあなたのStartup.Auth.csでのCookieNameを設定することができます。

public partial class Startup 
{ 
    // For more information on configuring authentication, please visit http://go.microsoft.com/fwlink/?LinkId=301864 
    public void ConfigureAuth(IAppBuilder app) 
    { 
     // Enable the application to use a cookie to store information for the signed in user 
     app.UseCookieAuthentication(new CookieAuthenticationOptions 
     { 
      AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie, 
      LoginPath = new PathString("/Account/Login"), 
      CookieName = "MyCookieName", 

     }); 
    } 
} 
+0

今、絶対的な意味があります。ありがとう! –

関連する問題