2017-01-03 276 views
0

有關啓用身份驗證的tutorials可以正常工作,但是應該使用什麼標識符來爲數據庫中的用戶存儲數據?易於獲得的唯一東西是User.Name,這似乎是我的電子郵件地址。ASP.NET核心身份驗證ID?

我在數據庫中看到有一個AspNetUsers表,其中UserName列和varchar Id列似乎是GUID並且是主鍵。看起來'Id'字段是使用的邏輯值,但它在我的應用程序中不可用。我發現我可以這樣做:

string ID_TYPE = "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/nameidentifier"; 
var id = User.Claims.Where(x => x.Type == ID_TYPE).Select(x => x.Value).FirstOrDefault(); 

但是,這似乎是一個奇怪的方式去解決它。如果我想創建一個有帖子關聯用戶的'Posts'表,那麼這個值是否合適呢?

我看過thesepages而且看起來很多這可能是由於Microsoft將相同的登錄過程與ActiveDirectory集成在一起。

是否有理由讓id很難找到,名字如此簡單?我應該使用這個名字嗎?我應該小心不要讓用戶改變他們的用戶名嗎?

回答

2

到用戶ID的最短路徑是:

public static class ClaimsPrincipalExtensions 
{ 
    public static string GetUserId(this ClaimsPrincipal principal) 
    { 
     if (principal == null) 
      return null; //throw new ArgumentNullException(nameof(principal)); 

     string ret = ""; 

     try 
     { 
      ret = principal.FindFirst(ClaimTypes.NameIdentifier)?.Value; 
     } 
     catch (System.Exception) 
     {     
     } 
     return ret; 
    } 
} 

用法:如果你需要訪問用戶ID很多

User.FindFirst(ClaimTypes.NameIdentifier)?.Value; 

或者創建延伸,像這樣

User.GetUserId() 
0

在你控制器使用依賴注入來獲取用戶管理器: 創建一個MyUser類,它具有您的擴展屬性

public class MyUser : IdentityUser 
    { 
    public string MyExendedInfo { get; set; } 
    public int MyOtherInfo {get;set;} 
    } 

使用遷移將此屬性添加到數據庫,或手動添加它。

在Startup.cs在配置服務添加:

services.AddIdentity<MyUser, IdentityRole>() 

現在注入這在你的控制器類:

private readonly UserManager<MyUser> _userManager; 
public HomeController(
     UserManager<MyUser> userManager) 
     { 
     _userManager = userManager; 
     } 

現在,您可以訪問更多的proporties和身份證(如果你還需要這個)你的動作方法是這樣的:

var user = await _userManager.GetUserAsync(HttpContext.User); 
var id = user.Id; 
var myExtendedInfo = user.MyExtendedInfo; 
var myOtherInfo = user.MyOtherInfo; 

etc

您也可以更新您的用戶信息:

user.myExtendedInfo = "some string"; 
user.MyOtherInfo = myDatabase.pointer; 
var result = await _userManager.UpdateAsync(user); 
if (!result.Succeeded) 
{ 
    //handle error 
} 

所以只要你想存儲在數據庫中只有有限的額外數據,您可以創建自定義的用戶類,並使用標識系統來存儲它適合你。我不會自己保存它。 但是,如果您需要將大量信息存儲在單獨的表格中和/或從其他表格中引用用戶,則Id是正確的字段,您可以按照上圖所示訪問它。

我不知道什麼是最佳做法是多少信息可以存儲在AspNetUsers,而不是在聲明,而不是在自己的表,但由於提供的表已經存儲的東西,如用戶名,電話號碼等,我認爲可以像這樣擴展它。

+0

而不是Id,你可以使用任何你知道我唯一的字段,例如NormalizedUserName或NormalizedEmail,就像上面所顯示的一樣。 var email = user.NormalizedEmail; –