為什麼來自一個站點的 ASP.NET Identity 登錄會與同一台電腦上的不同站點共享?
我創建了一個全新的 Web 應用程序,說“WebApplication1” - 身份驗證設置為個人使用者帳戶的 WebForms。我不會在自動生成的程式碼模板中添加一行程式碼。我執行應用程序並註冊使用者“User1”並登錄 - 工作正常。
現在我創建另一個 Web 應用程序“WebApplication2” - 身份驗證設置為個人使用者帳戶的相同 WebForms。再次沒有程式碼,我執行應用程序。現在我創建另一個使用者說“User2” - 工作正常。
當兩個應用程序同時執行時,問題就開始了。如果我以“User1”身份登錄到第一個站點,這會自動將第二個站點的 Context.User.Identity 從“webApplication2”設置為“User1”,而它甚至沒有註冊“User1”,反之亦然,如果我登錄從一個站點退出另一個站點。
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 Identity 如何工作的基本知識,所以請幫助我。
提前致謝。
如果您的伺服器配置為使用 Cookie 身份驗證,則伺服器將向瀏覽器返回一個 cookie,其中包含有關使用者的加密和簽名聲明。
此 cookie 預設命名為:.AspNet.ApplicationCookie。
此 cookie 將儲存在您的瀏覽器中,直到它過期(預設 14 天和滑動到期)或您明確退出會刪除 cookie。
如果您打開另一個相同瀏覽器類型的選項卡或視窗,在您登錄後,它也將具有相同的 cookie,並在向您的兩個網站中的任何一個發送請求時傳遞它。
如果兩個站點都被配置為查找相同的 cookie 名稱,那麼它們都將看到它並能夠解密身份驗證 cookie,因為它們共享同一台機器,因此伺服器使用機器密鑰來加密/解密和簽署曲奇餅。cookie 中沒有任何內容告訴它屬於同一伺服器中的哪個站點,因此儲存在您的網站 WebApplication1 中的“User1”聲明將被視為在 WebApplication2 上經過身份驗證。如果傳入請求中有有效的 cookie,OWIN 身份驗證中間件將不會檢查數據庫。它將簡單地使用 cookie 中提供的加密聲明(使用者名、可能的角色和其他)。
如果您在兩個 Web 應用程序中設置不同的 CookieName,它們將不會使用相同的身份驗證 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", }); } }