我们正在使用ASP.NET Identity 2.0,并希望允许更改用户名。更改后,会发生以下情况:
问题是第3步,登录后仍然使用旧用户名返回用户,即使在数据库中它是新用户名,并使用新用户名登录。
我尝试了以下内容来清除现有的引用:
Context.GetOwinContext().Authentication.SignOut(); // also tried it with DefaultAuthenticationTypes.ExternalCookie
Session.Clear();
Session.Abandon();
// sign in with the new username => no problem
IdentityHelper.SignIn(manager, user, false);
// added this later, when the rest didn't work, but didn't help either
Context.User = new System.Security.Principal.GenericPrincipal(new System.Security.Principal.GenericIdentity(user.UserName), roles);
// tried this too, but didn't help either
System.Web.Security.FormsAuthentication.SetAuthCookie(user.UserName, true);
// after executing the following statement, user always has the old username
var user = Context.User.Identity.GetUserName();
所有语句都可以正确执行。还有什么想法还需要做什么吗?
修改
还尝试通过循环清除缓存
foreach (System.Collections.DictionaryEntry entry in HttpContext.Current.Cache)
HttpContext.Current.Cache.Remove(entry.Key as string);
以及Context.Application.Clear();
还尝试擦拭用户,即' Context.User = null'但是这导致了signIn的例外。当我执行' user = manager.Find(" newUserName",password)'要登录,它会返回用户,但即使使用新用户名检索,它仍然实际上包含旧用户名。不知道还有什么我应该清楚的。
答案 0 :(得分:1)
也发布这个答案,因为我正在撕掉我的头发:)
我尝试了所有内容,甚至是上面列出的重定向。但是我遇到了这篇文章http://benfoster.io/blog/aspnet-identity-stripped-bare-mvc-part-2并注意到他正在使用注销,除非他指定了类型
_applicationSignInManager.AuthenticationManager.SignOut("ApplicationCookie")
而不是留空,我尝试了它的工作!没有重定向。
所以我的代码看起来像这样 -
_applicationSignInManager.AuthenticationManager.SignOut("ApplicationCookie");
FormsAuthentication.SignOut(); // doing for good measure (might not need)
// Sign back in (Does the password sign in etc)
var resultSignIn = helper.PasswordSignIn(userName: userName, password: password, isPersistent: false, shouldLockout: true);
// Update the HttpContext with the new user
HttpContext.Current.User = new GenericPrincipal(new GenericIdentity(userName), new string[] { });
答案 1 :(得分:0)
将此作为答案发布,以防其他人将头发拉出来。结果是重定向做解决问题,但需要在signOut和signIn之间完成。
如果重定向发生在signIn之后,正如我之前尝试过的那样,旧值保留。因此,在重定向过程中似乎有些东西被清除,我无法手动删除,但在重新登录之前需要清除。