簡體   English   中英

使用ASP.Net Identity EntityFramwork到ID列設置為UniqueIdentifier的現有AspNetUsers表

[英]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的類型。 如果要使用自定義的UserLoginUserRoleUserClaim (默認情況下,它們的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經理提供的自定義實體類(例如UserManagerSignInManager ):

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM