2015-07-02 59 views
17

我正在使用Identity v2和MVC 5進行外部登錄。如何在成功登錄後立即在控制器中獲取身份用戶ID?

在我的外部登錄的回調函數,我登錄與

var result = await SignInManager.ExternalSignInAsync(loginInfo, isPersistent: false); 

再有就是對result交換機的用戶,我需要訪問的success情況下,用戶的ID,但User.Identity.GetUserId();給我這裏是null。

在這種情況下,我如何訪問用戶的ID?

+0

你必須創建自定義ExternalSignInAsync methiod將返回一個模型,用戶ID和成功的結果。檢查安裝包Microsoft.AspNet.Identity.Samples nuget包瞭解更多詳細信息。 – DSR

+0

[使用MVC 5的身份,登錄後無法獲取用戶名]的可能重複(http://stackoverflow.com/questions/30429373/using-mvc-5s-identity-cant-get-user-name-權利後登錄) –

回答

31

要獲得簽名的理賠數據和其他信息身份立即成功登錄後,無需訪問數據庫,只需訪問signinManager.AuthenticationManager.AuthenticationResponseGrant.Identity即可。

例如,

switch (result) { case SignInStatus.Success: var userId = signinManager.AuthenticationManager.AuthenticationResponseGrant .Identity.GetUserId(); // ...

你也可以看到它在this other question's answer使用登錄後立即添加到身份的新要求 - AuthenticationManager.AuthenticationResponseGrant.Identity.AddClaims(freshClaims);

+0

這絕對是最簡單的解決方案! – kloarubeek

+0

謝謝 - 這正是我想要的。 – Aaron

+0

一直在尋找這個多年。我使用: Dim IDClaim As Claim = signInManager.AuthenticationManager.AuthenticationResponseGrant.Identity.Claims.FirstOrDefault(Function(o)o.Type = ClaimTypes.NameIdentifier)Dim UserID As Integer = Convert.ToInt32(IDClaim.Value)。謝謝! – Resource

0

好的,我找到了one way;我可以通過:

var userID = UserManager.FindByEmail(loginInfo.Email).Id; 

但是,我不認爲這是最好的解決方案,因爲它似乎是我打兩個查詢數據庫。任何人都能提供更好的解決方案

+0

不是一個好方法。您不會進入UserID.UserId的數據庫,電子郵件已存在於身份聲明中。 –

+0

@SerdarÇatalpınar:我的要點是要求更好的方法。感謝你的回答。 –

2

你可以使用下面的代碼。

Add功能ApplicationSignInManager類Identity.Config.cs

public override Task SignInAsync(ApplicationUser user, bool isPersistent, bool rememberBrowser) 
{ 
      var claims = new List<Claim>() 
      { 
       new Claim(ClaimTypes.NameIdentifier, user.Id), 
       new Claim(ClaimTypes.Email, user.Email) 
      }; 
      this.AuthenticationManager.User.AddIdentity(new ClaimsIdentity(claims)); 
      return base.SignInAsync(user, isPersistent, rememberBrowser); 
} 

嘗試的部份代碼

private ClaimsPrincipal GetCurrentUser() 
     { 
      var context = HttpContext.GetOwinContext(); 
      if (context == null) 
       return null; 

      if (context.Authentication == null || context.Authentication.User == null) 
       return null; 

      return context.Authentication.User; 
     } 
     private string GetUserId() 
     { 
      var user = GetCurrentUser(); 
      if (user == null) 
       return null; 

      var claim = user.Claims.FirstOrDefault(o => o.Type == ClaimTypes.NameIdentifier); 
      if (claim == null) 
       return null; 

      return claim.Value; 
     } 

     private string GetUserEmail() 
     { 
      var user = GetCurrentUser(); 
      if (user == null) 
       return null; 

      var claim = user.Claims.FirstOrDefault(o => o.Type == ClaimTypes.Email); 
      if (claim == null) 
       return null; 

      return claim.Value; 
     } 
+0

不幸的是我太快接受了。無論我做什麼,身份。GetUserId ();在登錄成功之後,不會給我任何東西,而只是null。我的猜測是,它等待登錄過程中的某個階段才能工作。 –

+0

問題似乎是,當signinmanager的登錄方法被調用並返回成功結果時,它不會更新要認證的身份用戶對象。任何想法如何我可以執行它在那裏更新? –

+0

你可以嘗試在上面的代碼。我改變了代碼行。 –

1

我用System.Security.Claims.ClaimTypes.NameIdentifier對象,以保持我的用戶ID

我創建了一個幫助類來達到它的值

public class UserHelper 
    { 
    public static string GetUserId() 
    { 
     var identity = (System.Security.Claims.ClaimsPrincipal)System.Threading.Thread.CurrentPrincipal; 
     var principal = System.Threading.Thread.CurrentPrincipal as System.Security.Claims.ClaimsPrincipal; 
     var userId = identity.Claims.Where(c => c.Type == System.Security.Claims.ClaimTypes.NameIdentifier).Select(c => c.Value).SingleOrDefault(); 
     return userId; 
    } 
    public static string GetUserName() 
    { 
     var identity = (System.Security.Claims.ClaimsPrincipal)System.Threading.Thread.CurrentPrincipal; 
     var principal = System.Threading.Thread.CurrentPrincipal as System.Security.Claims.ClaimsPrincipal; 
     var name = identity.Claims.Where(c => c.Type == System.Security.Claims.ClaimTypes.Name).Select(c => c.Value).SingleOrDefault(); 
     return name; 
    } 
    public static string GetUserMail() 
    { 
     var identity = (System.Security.Claims.ClaimsPrincipal)System.Threading.Thread.CurrentPrincipal; 
     var principal = System.Threading.Thread.CurrentPrincipal as System.Security.Claims.ClaimsPrincipal; 
     var mail = identity.Claims.Where(c => c.Type == System.Security.Claims.ClaimTypes.Email).Select(c => c.Value).SingleOrDefault(); 
     return mail; 
    } 
    } 

,我把它與

var user = UserHelper.GetUserId(); 
+0

謝謝,解決了我的問題 – Parveen

相關問題