2016-08-18 55 views
1

長話短說,我使用身份和在我的解決方案中,我創建了一個自定義帳戶設置頁面,工作正常和花花公子。問題是我在_Layout.cshtml中有用戶FirstNameLastNameASP.NET身份不是「保存」更新索賠

public static MvcHtmlString GetUsersFirstAndLastName(this HtmlHelper helper) 
    { 
     string fullName = HttpContext.Current?.User?.Identity?.Name ?? string.Empty; 

     var userIdentity = (ClaimsPrincipal)Thread.CurrentPrincipal; 
     var nameClaim = identity?.FindFirst("fullname"); 


     if (nameClaim != null) 
     { 
      fullName = nameClaim.Value; 
     } 

     return MvcHtmlString.Create(fullName); 
    } 

這種方法的偉大工程,直到用戶去他們的個人資料,並更新他們的名字:這個名字是由一個自定義的輔助方法,我有設置。如果他們改變他們的名字從GeorgeBob然後當他們四處在我的網站這個方法還是去拉他們作爲George的名字,直到他們註銷並重新登錄。

所以我做了什麼來解決這個問題是,當他們更新自己的在帳戶設置的名字,我添加了一些代碼,以消除他們的老fullName要求,並添加新的,就像這樣:

   var identity = User.Identity as ClaimsIdentity; 

       // check for existing claim and remove it 
       var currentClaim = identity.FindFirst("fullName"); 
       if (currentClaim != null) 
        identity.RemoveClaim(existingClaim); 

       // add new claim 
       var fullName = user.FirstName + " " + user.LastName; 

       identity.AddClaim(new Claim("fullName", fullName)); 

隨着這段代碼的_Layout視圖現在更新名稱(在我們前面的例子George現在將更改爲Bob)。 然而,,一旦點擊了該視圖到網站上的另一個地方或者當他們刷新頁面時,它就會立即更改爲George

身份仍然有點新我有點困惑,爲什麼這個新的更新聲明不適用後,他們點擊不同的頁面或刷新。任何幫助表示讚賞。 :)

+2

你可以重新發出餅乾 – tmg

回答

0

我找到了解決方案。當我加入了新的要求我也必須這樣做:

var authenticationManager = HttpContext.GetOwinContext().Authentication; 
    authenticationManager.AuthenticationResponseGrant = new AuthenticationResponseGrant(new ClaimsPrincipal(identity), new AuthenticationProperties() { IsPersistent = true }); 

因此,新的完整的代碼塊:

public static MvcHtmlString GetUsersFirstAndLastName(this HtmlHelper helper) 
    { 
     string fullName = HttpContext.Current?.User?.Identity?.Name ?? string.Empty; 

    var userIdentity = (ClaimsPrincipal)Thread.CurrentPrincipal; 
    var nameClaim = identity?.FindFirst("fullname"); 

    var authenticationManager = HttpContext.GetOwinContext().Authentication; 
    authenticationManager.AuthenticationResponseGrant = new AuthenticationResponseGrant(new ClaimsPrincipal(identity), new AuthenticationProperties() { IsPersistent = true }); 

    if (nameClaim != null) 
     { 
      fullName = nameClaim.Value; 
     } 

     return MvcHtmlString.Create(fullName); 
    }