注销/登录后,ASP.NET身份用户名不会刷新

时间:2014-11-10 09:57:54

标签: c# asp.net identity

我们正在使用ASP.NET Identity 2.0,并希望允许更改用户名。更改后,会发生以下情况:

  1. 用户已退出=>没有错误
  2. 在数据库中更改了用户名=>工作,变化是可见的
  3. 用户使用新用户名=>登录但仍可显示旧用户名
  4. 问题是第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)'要登录,它会返回用户,但即使使用新用户名检索,它仍然实际上包含旧用户名。不知道还有什么我应该清楚的。

2 个答案:

答案 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之后,正如我之前尝试过的那样,旧值保留。因此,在重定向过程中似乎有些东西被清除,我无法手动删除,但在重新登录之前需要清除。