/// <summary> /// 유효성 검사 /// </summary> /// <param name="context"></param> /// <returns></returns> public Task ValidateAsync(ResourceOwnerPasswordValidationContext context) { if (_userRepository.ValidateCredentials(context.UserName, context.Password)) {//일치하는 유저 정보가 있다. //유저 정보 불러오기 UserRepositoryModel user = _userRepository.FindByEmail(context.UserName); //권한 부여 유형을 지정한다. context.Result = new GrantValidationResult(user.idUser.ToString() , OidcConstants.AuthenticationMethods.Password); } else {//실패 //실패 코드 작성 Dictionary <string, object> dictError = new Dictionary <string, object>(); dictError.Add("errorCode", "1"); //실패 메시지 전달 context.Result = new GrantValidationResult(TokenRequestErrors.InvalidGrant , "invalid credential" , dictError); } return(Task.FromResult(0)); }
/// <summary> /// 전달받은 서브젝트아이디가 있는지 확인한다. /// 주의 : 직접 참조만 없을뿐이지 실제론 사용된다. /// 경고 : CS1998 /// </summary> /// <param name="context"></param> /// <returns></returns> public async Task IsActiveAsync(IsActiveContext context) { int nID = Convert.ToInt32(context.Subject.GetSubjectId()); UserRepositoryModel user = _userRepository.FindById(nID); //여기서 인증성공여부를 판단해서 메시지를 보낼 수 있을듯 한데... //인증관련 내용만 처리 가능 //context.Subject.Claims context.IsActive = user != null; }
/// <summary> /// 로그인에 사용하는 UserSignInfoModel을 /// IdentityServer4_Custom.UserServices.UserRepositoryModel 로 변환한다. /// </summary> /// <param name="insUserDB"></param> /// <returns></returns> private UserRepositoryModel ToUserRepositoryModel(UserSignInfoModel insUserDB) { UserRepositoryModel urmReturn = null; if (null != insUserDB) {//데이터가 있다. urmReturn = new UserRepositoryModel(); urmReturn.idUser = insUserDB.ID; urmReturn.SignEmail = insUserDB.Email; urmReturn.Password = insUserDB.Password; } return(urmReturn); }
/// <summary> /// 로그인에 사용하는 UserSignInfoModel을 /// IdentityServer4_Custom.UserServices.UserRepositoryModel 로 변환한다. /// </summary> /// <param name="insUserDB"></param> /// <returns></returns> private UserRepositoryModel ToUserRepositoryModel(UserAuthModel insUserDB) { UserRepositoryModel urmReturn = null; if (null != insUserDB) {//데이터가 있다. urmReturn = new UserRepositoryModel(); urmReturn.idUser = insUserDB.idUser; urmReturn.SignEmail = insUserDB.SignEmail; urmReturn.Password = string.Empty; } return(urmReturn); }
/// <summary> /// 서브젝트아이디에 해당하는 정보를 만든다. /// 주의 : 직접 참조만 없을뿐이지 실제론 사용된다. /// 경고 : CS1998 /// </summary> /// <param name="context"></param> /// <returns></returns> public async Task GetProfileDataAsync(ProfileDataRequestContext context) { int nID = Convert.ToInt32(context.Subject.GetSubjectId()); Logger.LogDebug("Get profile called for subject {subject} from client {client} with claim types {claimTypes} via {caller}", context.Subject.GetSubjectId(), context.Client.ClientName ?? context.Client.ClientId, context.RequestedClaimTypes, context.Caller); UserRepositoryModel user = _userRepository.FindById(nID); var claims = new List <Claim> { new Claim("role", "dataEventRecords.admin"), new Claim("role", "dataEventRecords.user"), new Claim("id", user.idUser.ToString()), new Claim("email", user.SignEmail) }; context.IssuedClaims = claims; }