programing

ASP.NET ID 인터페이스에서 기본 키와 외부 키에 문자열을 사용하는 이유는 무엇입니까?

linuxpc 2023. 7. 10. 22:07
반응형

ASP.NET ID 인터페이스에서 기본 키와 외부 키에 문자열을 사용하는 이유는 무엇입니까?

새로운 ASP.NET Identity 클래스의 인터페이스와 Entity Framework Code First를 사용하여 생성하는 데이터베이스를 살펴보고 있습니다.Visual Studio 2013 RC를 사용하고 있습니다.

언뜻 보기에 데이터베이스 스키마는 상당히 정상적으로 보입니다.

enter image description here

하지만 모든 키는 NVARCHAR(128)입니다.

그리고 어떤 미친 이유로AspNetUserSecrets.Id둘 이상의 레코드를 가리킬 수 있는 것처럼 보이는 PK입니다.AspNetUsers표. 이것은 다중을 의미합니다.AspNetUsers동일한 암호를 공유해야 합니까?

당신이 구현해야 하는 인터페이스 보기를 보면, 이것들은 모두 문자열입니다.

public class User : IUser
{
    public string Id { get; set; }
    public string UserName { get; set; }
}

public class UserSecret : IUserSecret
{
    public string UserName { get; set; }
    public string Secret { get; set; }
}

public class UserRole : IUserRole
{
    public string UserId { get; set; }
    public string RoleId { get; set; }
}

public class UserClaim : IUserClaim
{
    public string UserId { get; set; }
    public string ClaimType { get; set; }
    public string ClaimValue { get; set; }
}

public class UserManagement : IUserManagement
{
    public string UserId { get; set; }
    public bool DisableSignIn { get; set; }
    public DateTime LastSignInTimeUtc { get; set; }
}

public class Tokens : IToken
{
    public string Id { get; set; }
    public string Value { get; set; }
    public DateTime ValidUntilUtc { get; set; }
}

public class UserLogin : IUserLogin
{
    public string UserId { get; set; }
    public string LoginProvider { get; set; }
    public string ProviderKey { get; set; }
}

public class Role : IRole
{
    public string Id { get; set; }
    public string Name { get; set; }
}

그래서 저는 PK와 FK 관계를 위해 문자열을 사용하여 이를 구현해야 할 수도 있다는 사실에 동의합니다.

하지만 왜 이렇게 지어졌는지 정말 알고 싶어요...?

편집: 시간이 지나 asp.net ID를 확장하여 int(또는 guid) 필드를 사용하는 방법에 대한 기사가 있습니다.

http://www.asp.net/identity/overview/extensibility/change-primary-key-for-users-in-aspnet-identity

목적은 두 가지 임의 ID 유형(즉, 임의 ID 유형)을 모두 허용하는 것이었습니다.int,guid,string)을 사용하지만 ID 속성에 대한 직렬화/캐스팅 문제가 발생하지 않도록 해야 합니다.

따라서 원하는 대로 키를 정의하고 인터페이스 방법을 구현할 수 있습니다.

public class MyUser : IUser {
  public int Id { get; set; }
  string IUser.Id { get { return Id.ToString(); } }
}

Hao가 말한 것에 추가:

  1. Identity 런타임은 사용자 ID의 적절한 직렬화를 파악하는 것을 원하지 않기 때문에 사용자 ID에 대한 문자열을 선호합니다(예: 모든(또는 대부분) ID 인터페이스가 사용자 ID를 문자열로 참조함).
  2. 지속성 계층을 사용자 지정하는 사용자(예: 엔터티 유형)는 키에 대해 원하는 유형을 선택할 수 있지만 키의 문자열 표현을 제공합니다.
  3. 기본적으로 각 새 사용자에 대해 GUID의 문자열 표현을 사용하지만, 이는 고유 ID를 자동으로 생성하는 매우 쉬운 방법을 제공하기 때문입니다.

ASP.NET Core를 사용하면 ID 모델에 사용할 데이터 유형을 매우 간단하게 지정할 수 있습니다.

첫 번째 단계: ID 클래스를 <string>에서 < 원하는 데이터 유형>으로 재정의합니다.

public class ApplicationUser : IdentityUser<Guid>
{
}

public class ApplicationRole : IdentityRole<Guid>
{
}

클래스와 원하는 데이터 유형을 사용하여 데이터베이스 컨텍스트를 선언합니다.

public class ApplicationDbContext : IdentityDbContext<ApplicationUser, ApplicationRole, Guid>
    {
        public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options)
            : base(options)
        {
        }

        protected override void OnModelCreating(ModelBuilder builder)
        {
            base.OnModelCreating(builder);
            // Customize the ASP.NET Identity model and override the defaults if needed.
            // For example, you can rename the ASP.NET Identity table names and more.
            // Add your customizations after calling base.OnModelCreating(builder);
        }
    }

그리고 시작 클래스에서 모델을 사용하여 ID 서비스를 선언하고 기본 키에 대해 원하는 데이터 유형을 선언합니다.

services.AddIdentity<ApplicationUser, ApplicationRole>()
            .AddEntityFrameworkStores<ApplicationDbContext, Guid>()
            .AddDefaultTokenProviders();

ASP.NET ID 테이블에서 기본 키는 여전히 NVARCHAR에 있지만 응용 프로그램에서는 원하는 데이터 유형이 됩니다.컨트롤러에서 이를 확인할 수 있습니다.

    [HttpGet]
    public async Task<IActionResult> Test()
    {
        ApplicationUser user = await _userManager.GetUserAsync(HttpContext.User);
        Guid userId = user.Id; // No cast from string, it's a Guid data type
        throw new NotImplementedException();
    }

언급URL : https://stackoverflow.com/questions/19238621/why-do-the-asp-net-identity-interfaces-use-strings-for-primary-and-foreign-keys

반응형