Как настроить токены JWT в удостоверении ASP.NET CORE? - PullRequest
0 голосов
/ 30 мая 2018

Новое в этом.Потратил на это много часов.Я пытаюсь добавить издателя JWT на существующий сайт, чтобы я мог разработать мобильное приложение.Я добавил это в автозагрузку:

services.AddAuthorization(auth =>
        {
            auth.AddPolicy("Bearer", new AuthorizationPolicyBuilder()
                .AddAuthenticationSchemes(JwtBearerDefaults.AuthenticationScheme‌​)
                .RequireAuthenticatedUser().Build());
        });
        services.AddAuthentication(options =>
        {
            options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
            options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
        }).AddJwtBearer(options => {
            options.TokenValidationParameters =
                   new TokenValidationParameters
                   {
                       ClockSkew = TimeSpan.FromMinutes(5),
                       ValidateIssuer = false,
                       ValidateAudience = true,
                       ValidateLifetime = true,
                       ValidateIssuerSigningKey = true,
                       RequireSignedTokens = true,
                       RequireExpirationTime = true,

                       ValidIssuer = "https://URL",
                       ValidAudience = "https://URL",
                       IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes("fbsghfdgjdgfjdbjgbjdbgjdbgjbdfjgbdfgjdbgjbfjdgbjdfgb"))
                   };

            options.Events = new JwtBearerEvents
            {
                OnAuthenticationFailed = context =>
                {
                    Console.WriteLine("OnAuthenticationFailed: " + context.Exception.Message);
                    return Task.CompletedTask;
                },
                OnTokenValidated = context =>
                {
                    Console.WriteLine("OnTokenValidated: " + context.SecurityToken);
                    return Task.CompletedTask;
                }
            };
        });

У меня есть это в контроллере учетной записи для выдачи токена.Я немного запутался в том, как это должно работать. Должен ли я использовать ту же логику входа, которую использует действие входа, через usermanager?Или просто проверьте имя пользователя и пароль и отправьте токен обратно?

    [HttpPost]
    [Route("/token3")]
    [AllowAnonymous]
    public async Task<IActionResult> Token3(TokenRequest model)
    {
        if (ModelState.IsValid)
        {
            var user = await UserManager.FindByEmailAsync(model.username);
            if (user != null)
            {

                var result = await _signInManager.CheckPasswordSignInAsync
                                (user, model.password, lockoutOnFailure: false);

                if (!result.Succeeded)
                {
                    return Unauthorized();
                }

                var claims = new[]
                {
                    new Claim(JwtRegisteredClaimNames.Sub, model.username),
                    new Claim(JwtRegisteredClaimNames.Jti, Guid.NewGuid().ToString())
                };

                var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes("fbsghfdgjdgfjdbjgbjdbgjdbgjbdfjgbdfgjdbgjbfjdgbjdfgb"));
                var creds = new SigningCredentials(key, SecurityAlgorithms.HmacSha256);

                var token = new JwtSecurityToken(
                    issuer: "https:/URL",
                    audience: "https://URL",
                    claims: claims,
                    expires: DateTime.Now.AddDays(7),
                    signingCredentials: creds);
                return Ok(new { token = new JwtSecurityTokenHandler().WriteToken(token) });

                //return new JwtSecurityTokenHandler().WriteToken(token);
            }
        }
        return BadRequest("Could not verify username and password");
    }

Теперь это возвращает мне токен, если я вызываю его с именем пользователя / паролем в заголовках.Но если я пытаюсь использовать токен, я получаю ошибки и перенаправляется для входа в систему.Основная информация от удаленного отладчика дает мне это:

Microsoft.AspNetCore.Authentication.JwtBearer.JwtBearerHandler:Information:   Failed to validate the token <TOKEN>
IDX10503: Signature validation failed. Keys     tried: 'Microsoft.IdentityModel.Tokens.SymmetricSecurityKey
Microsoft.AspNetCore.Authorization.DefaultAuthorizationService:Information: Authorization failed for user: (null).

Мое тестовое действие:

    [HttpGet]
    [Route("/test")]
    [Authorize(AuthenticationSchemes = JwtBearerDefaults.AuthenticationScheme)]
    public IActionResult Test()
    {
        return Ok("ok");
    }
...