我创建了一个全新的Web应用程序,说"WebApplication1" - 将身份验证设置为个人用户帐户的WebForms.我没有向自动生成的代码模板添加一行代码.我运行应用程序并注册用户"User1"并登录 - 工作正常.
现在我创建另一个Web应用程序"WebApplication2" - 将身份验证设置为单个用户帐户的相同WebForms.再次没有代码,我运行应用程序.现在我创建另一个用户说"User2" - 工作正常.
当两个应用程序同时运行时,问题就开始了.如果我以"User1"身份登录到第一个站点,那么当它甚至没有注册"User1"时,它会自动将第二个站点的Context.User.Identity从"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身份验证,则服务器将向浏览器返回一个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", }); } }