![](/img/trans.png)
[英]ASP.NET MVC - Using Identity with existing, modified AspNetUsers table
[英]Using ASP.Net Identity EntityFramwork to Existing AspNetUsers table with ID Column set to UniqueIdentifier
我正在使用Nuget包Microsoft.AspNet.Identity.EntityFramework,並連接到現有的SQL Server數據庫,其中AspNetUsers表ID列設置為UniqueIdentifier。
在執行呼叫以獲取用戶時,出現錯誤:
無法將'IdentityUser`4'的'Id'屬性設置為'System.Guid'值。 您必須將此屬性設置為'System.String'類型的非空值。
有一種方法可以在代碼中設置Id屬性,因為我無法修改數據庫中的column屬性。
這是我的代碼段:
AuthProvider.cs
public class SimpleAuthorizationServerProvider : OAuthAuthorizationServerProvider
{
public override async Task GrantCredentials(OAuthGrantResourceOwnerCredentialsContext context)
{
using(Repository _repo = new Repository())
{
IdentityUser user = await _repo.FindUser(context.UName, context.PWord);
if(user == null)
{
// User Not Found / Invalid UName or PWord.
}
}
}
}
Repository.cs
public class Repository : IDisposable
{
private AppContext _ctx;
private UserManager<IdentityUser> _usrMgr;
public Repository()
{
_ctx = new AppContext();
_usrMgr = new UserManager<IdentityUser>(new UserStore<IdentityUser>(_ctx));
}
public async Task<IdentityUser> FindUser(string uName, string pWord)
{
// Setting the breakpoint here in this line below:
IdentityUser usr = await _usrMgr.FindAsync(uName, pWord);
return user;
}
}
在我在Repository.cs上設置的斷點上,我在_usrMgr變量上展開並檢查Users屬性時看到錯誤。
更新:我在這里找到了一些信息(在標題部分):
但我不確定如何正確實施。 我需要添加新課程嗎? 我的理解那里的實現是相當模糊的。
實際上,是的,您必須實現自己的IdentityUser
類。 默認情況下,在識別框架IdentityUser
ID類型為string
,這並不總是可以接受的。 因此,您可以執行以下操作:
public sealed class User : IdentityUser<int, UserLogin, UserRole, UserClaim>
其中int
是用戶ID的類型。 如果要使用自定義的UserLogin
, UserRole
或UserClaim
(默認情況下,它們的ID也是UserClaim
,因此您可能也想這樣做),則必須添加自定義繼承的類:
public class UserRole : IdentityUserRole<int> { } //int is id type
public class UserClaim : IdentityUserClaim<int> { } //int is id type
public class UserLogin : IdentityUserLogin<int> { } //int is id type
接下來要做的是使用所有由Identity經理提供的自定義實體類(例如UserManager
或SignInManager
):
public class ApplicationUserManager : UserManager<User, int> {}
public class ApplicationSignInManager : SignInManager<User, int> {}
其中, User
類型是您的自定義User : IdentityUser<int, UserLogin, UserRole, UserClaim>
(如上所述),而int
是id類型。 因此,用兩個詞來說,基本思想是使用您自己的實現繼承默認的Identity類型,並在Identity使用其默認類型的地方使用它們。 這是可以的做法。 對於您的情況,我建議UniqueIdentifier
是一些自定義類型,因此您必須使用此類型而不是int
( 例如您提供的示例 ):
public sealed class User : IdentityUser<UniqueIdentifier, UserLogin, UserRole, UserClaim>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.