3
respostas

Possível erro, e sugestão de correção

Material está excelente, só 2 detalhes que vi no final, creio q estejam errado

Na atividade opcional no final do curso ASP.NET Core parte 4, de criar uma opção de registrar novos usuários, num bloco tem o seguinte código:

    var claimsResult = _userManager.AddClaimsAsync(user, new Claim[]{
        new Claim("name", user.UserName),
        new Claim(JwtClaimTypes.GivenName, ""),
        new Claim(JwtClaimTypes.FamilyName, ""),
        new Claim("email", user.Email),
        new Claim(JwtClaimTypes.EmailVerified, "true", ClaimValueTypes.Boolean),
    }).Result;
    if (!claimsResult.Succeeded)
    {
        throw new Exception(result.Errors.First().Description);
    }

Eu acredito que deveria tirar o Resulta e colocar await (pois o método é assíncrono) E no throw Exception, ele está referenciando ao result (que está um nível acima, sendo que o teste de erro, foi na variável claimsResult

Na minha sugestão, o código ficaria assim:

    var claimsResult = await _userManager.AddClaimsAsync(user, new Claim[]
    {
        new Claim("name", user.UserName),
        new Claim(JwtClaimTypes.GivenName, ""),
        new Claim(JwtClaimTypes.FamilyName, ""),
        new Claim("email", user.Email),
        new Claim(JwtClaimTypes.EmailVerified, "true", ClaimValueTypes.Boolean)
    });
    if (!claimsResult.Succeeded)
    {
        throw new Exception(claimsResult.Errors.First().Description);
    }
3 respostas

Olá Thiago, tudo certo?

Baixei a solução completa do curso e achei esse trecho de código. E sinto lhe dizer que a exceção faz referência a variável result, ficando throw new Exception(result.Errors.First().Description); mesmo.

Porém, você está certo, o método é assíncrono e pode fazer deste outro jeito, mas diz aí, está funcionando normalmente? Conseguiu testar esta exceção para ver qual é o resultado?

Vou passar pra o instrutor e ver se conseguimos fazer a alteração.

No aguardo!

Sim, funcionou perfeitamente, quanto a referencia ao result, talvez não fui claro, vou tentar elaborar melhor

    var result = await _userManager.CreateAsync(user, model.Password);
    if (result.Succeeded)
    {
        await _signInManager.SignInAsync(user, isPersistent: false);
        var claimsResult = await _userManager.AddClaimsAsync(user, new Claim[]
        {
            new Claim("name", user.UserName),
            new Claim(JwtClaimTypes.GivenName, ""),
            new Claim(JwtClaimTypes.FamilyName, ""),
            new Claim("email", user.Email),
            new Claim(JwtClaimTypes.EmailVerified, "true", ClaimValueTypes.Boolean)
        });
        if (!claimsResult.Succeeded)
        {
            throw new Exception(claimsResult.Errors.First().Description);
        }
        return Redirect(model.ReturnUrl);
    }

O throw new Exception está dentro do if (result.Succeeded) e do if (!claimsResult.Succeeded), portanto, ele não contem erros para jogar, já o claimsResult sim possui pois é uma negação do sucesso

Não sei se fui claro

É um detalhe bobo, mas que em caso de erro, não mostraria a mensagem adequada

Pior que isso realmente faz sentido. Depois que te respondi, fiquei pensando nisso, que o erro faz mais sentido com o claimsResult que no result.

Bom, vou passar adiante para ver o que dá para fazer com a sugestão.

Bons estudos!