现在我创建另一个Web应用程序“WebApplication2” – 与设置为个人用户帐户的身份验证相同的WebForms。再次没有代码,我运行应用程序。现在我创建另一个用户说“User2” – 工作正常。
当两个应用程序同时运行时,问题开始。
如果我以“User1”登录第一个站点,则当第二个站点的Context.User.Identity甚至没有注册“User1”时,会自动设置“webApplication2”为“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默认名为:.AspNet.ApplicationCookie。
此Cookie将存储在您的浏览器中,直到它过期(默认14天并滑动到期),或者您明确退出删除该cookie。
如果您打开另一个浏览器类型的选项卡或窗口,则在登录后,它也将具有相同的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",}); } }