2017-10-18 2 views
0

사용자를 CreateAsync 할 때 오류가 발생합니다..NET Core 2 Identity CreateAsync 오류 캐스팅

var create = await _userManager.CreateAsync(user, model.Password); 

내가 errors라는 IdentityResult에 액세스 할 수있는 특성이있다. 그러나 나는 그것을 액세스하는 방법을 해결할 수 없습니다. 어떤 생각이 나는 그것을 잡을 수 있으므로 나는 그것이 무엇을 잘못보고 있는지 알 수 있습니까?

아래에서 전체 컨트롤러 코드를 게시했습니다. 어떤 이유로 든 내 var를 만들려고 할 때마다 그냥 무시한다. 나는 그걸 밟을조차 수 없다.

namespace TechsportiseOnline.Controllers 
{ 
    [Produces("application/json")] 
    [Route("api/[controller]/[action]")] 
    public class RegistrationController : Controller 
    { 
     private readonly UserManager<ApplicationUser> _userManager; 
     private readonly SignInManager<ApplicationUser> _signInManager; 
     private readonly IConfiguration _configuration; 
     private readonly IOptions<JWTSettings> _jwtConfig; 
     private readonly IEmailSender _emailSender; 

     public RegistrationController(
       UserManager<ApplicationUser> userManager, 
       SignInManager<ApplicationUser> signInManager, 
       IConfiguration configuration, 
       IOptions<JWTSettings> jwtConfig, 
       IEmailSender emailSender) 
        { 
         _userManager = userManager; 
         _signInManager = signInManager; 
         _configuration = configuration; 
         _jwtConfig = jwtConfig; 
         _emailSender = emailSender; 

     } 

     [AllowAnonymous] 
     [HttpPost] 
     public async Task<IActionResult> Register([FromBody] RegisterModel model) 
     { 
      if (ModelState.IsValid) 
      { 

       var user = new ApplicationUser 
       { 
        UserName = model.Email, 
        Email = model.Email, 
        FirstName = model.FirstName, 
        LastName = model.LastName, 
        MobileNumber = model.MobileNumber, 
        Marketing = model.Marketing, 
        Newsletter = model.Newsletter 
       }; 

       var result = new CreateUserResult(); 

       var create = await _userManager.CreateAsync(user, model.Password); 




       if (create.Succeeded == true) 
       { 

        var code = await _userManager.GenerateEmailConfirmationTokenAsync(user); 
        var callbackUrl = Url.EmailConfirmationLink(user.Id, code.ToString(), Request.Scheme); 
        await _emailSender.SendEmailConfirmationAsync(model.Email, callbackUrl); 


        //await _createContact.CreateContactAsync(model.Email, model.FirstName, model.LastName, model.Marketing, model.Newsletter); 
        var fields = new Dictionary<string, string>(); 
        fields.Add("firstname", model.FirstName); 
        fields.Add("lastname", model.LastName); 
        fields.Add("newsletter", model.Newsletter.ToString()); 
        fields.Add("marketing", model.Marketing.ToString()); 
        string publicaccountid = "55ebcc8b-b23f-4843-9dcb-1df08811de65"; 
        var createcontact = ElasticEmailClient.Api.Contact.AddAsync(publicAccountID: publicaccountid, email: model.Email, field: fields); 



        //await _signInManager.SignInAsync(user, isPersistent: false); 
        return CreatedAtRoute("CreateAccount", model); 
       } 
       else 
       { 
        return BadRequest("Could not register account"); 
       } 
      } 
      else 
      { 
       return BadRequest("The model is invalid"); 
      } 
     }  
    } 


} 

답변

0

이것은 내 샘플 코드입니다. MediatR을 사용하여 쿼리와 명령을 분리하려고합니다.

CreateUserByAdminHandler 다음

public class CreateUserByAdminHandler : IAsyncRequestHandler<CreateUserByAdmin, CreateUserResult> 
{ 
    private readonly UserManager<AppUser> _userManager; 

    public CreateUserByAdminHandler(UserManager<AppUser> userManager) 
    { 
     _userManager = userManager; 
    } 

    public async Task<CreateUserResult> Handle(CreateUserByAdmin command) 
    { 
     var result = new CreateUserResult(); 

     try 
     { 
      var appUser = new AppUser 
      { 
       UserName = command.Username.Trim(), 
       FirstName = command.FirstName.Trim(), 
       LastName = command.LastName.Trim(), 
       Email = command.Email, 
       PhoneNumber = command.PhoneNumber, 
       Status = UserStatus.Active 
      }; 

      var createResult = await _userManager.CreateAsync(appUser, command.Password); 
      if (!createResult.Succeeded) 
      { 
       // IdentityResult has Errors property, which is a list of 
       // IdentityError. IdentityError has Code and Description 
       // property. It's up to you to select whichever property 
       // for the error message. 

       result.AddErrors(createResult.Errors.Select(ier => ier.Description)); 
       return result; 
      } 

      result.NewUser = appUser; 
     } 
     catch (Exception ex) 
     { 
      result.SetException(ex); 
     } 

     return result; 
    } 
} 
+0

나는 비슷한 논리를 사용하여 시도했다, 그러나 나는 시도하고 (귀하의 예제에서 var에 createResult) 내 VAR에 관한 문을 작성하는 경우 모든 종류의를 배치하면 문제이며, 그것은 그것을 무시하고 다음 문장으로 건너 뜁니다 ... 저는 컨트롤러에서 전체 코드를 포함하도록 제 질문을 업데이트했습니다. –

+0

"그것을 무시하고 다음 명령문으로 건너 뜁니다.": create.Succeeded는 거짓이므로 다음 명령문으로 넘어갑니다. 아니면 프로그램이 거기에 매달려 있습니까? _userManager가 NULL인지 여부를 확인했는지 그리고 예외가 발생했는지 여부를 확인 했습니까? –

+0

'CreateAsync line'에 중단 점을 넣습니다. 신청서가 거기에서 정지합니다. Step Over 나 Step In 중 하나 인 경우 BadRequest ("계정을 등록 할 수 없습니다");'if 문에는 절대 도달하지 않습니다. 예외는 볼 수 없습니다. try/catch를 넣으면 동일한 동작을 보입니다. 그게 내가 이해하지 못하는 비트. –

관련 문제