사용자 정보를 관장하는 IdentityUser 클래스에 별도로 만든 필드 즉, 이름이나 생일 등등을 확장하고자 할 경우, 이를 상속받아 확장시켜야합니다. 아래에 4개 정도의 속성을 추가했는데요. 사용자 코드, 이름, 사용자특성, 활성화 여부 정도를 확장시킬 예정입니다. 당연히 database 의 테이블에도 아래 4개 필드가 존재합니다.
using System.Collections.Generic;
using System.Security.Claims;
using AspNetCore.Identity.Dapper.Stores;
using Microsoft.AspNetCore.Identity;
namespace AspNetCore.Identity.Dapper.Models
{
public class ApplicationUser : IdentityUser
{
[PersonalData]
public long UserID { get; set; }
[PersonalData]
public string Name { get; set; }
[PersonalData]
public int UserType { get; set; }
[PersonalData]
public bool IsActive { get; set; } = true;
internal List<Claim> Claims { get; set; }
internal List<UserRole> Roles { get; set; }
internal List<UserLoginInfo> Logins { get; set; }
internal List<UserToken> Tokens { get; set; }
}
}
위의 model 을 기반으로 이제 claim 을 커스터 마이징해야겠는데요. 위의 블로그 내용을 최대한 참조했는데, GenerateClaimsAsync() 함수를 override 할 경우 startup.cs 에서 해당 메소드를 호출되지 않아, 저는 아래 msdn 을 참고하여 CreateAsync() 함수를 사용했습니다.
using AspNetCore.Identity.Dapper.Models;
using Microsoft.AspNetCore.Identity;
using Microsoft.Extensions.Options;
using System.Collections.Generic;
using System.Security.Claims;
using System.Threading.Tasks;
namespace IdentityCoreDapper.Factory
{
public class AppClaimsPrincipalFactory : UserClaimsPrincipalFactory<ApplicationUser>
{
public AppClaimsPrincipalFactory(
UserManager<ApplicationUser> userManager,
IOptions<IdentityOptions> optionsAccessor)
: base(userManager, optionsAccessor)
{ }
public async override Task<ClaimsPrincipal> CreateAsync(ApplicationUser user)
{
var principal = await base.CreateAsync(user);
var identity = (ClaimsIdentity)principal.Identity;
var claims = new List<Claim>();
//추가한 클래임이며, 키값은 UserID 입니다.
claims.Add(new Claim("UserID", user.UserID.ToString()));
identity.AddClaims(claims);
return principal;
}
}
}
이제 위의 factory 클래스를 statup.cs 의 confConfigureServices() 에서 dependency injection container 로 등록해야 합니다. 이 부분도 블로그처럼 services.AddIdentity() 에 추가하지 않고, AddScoped로 DI 설정을 하였습니다.(코드제일 아래 2번째)