. NET Срок действия Core Jwt Token всегда истек при попытке доступа в Авторизованную область. - PullRequest
2 голосов
/ 17 апреля 2020

Это мой Startup.cs

services.AddAuthentication(x =>
{
    x.DefaultAuthenticateScheme = "bearer";
    x.DefaultChallengeScheme = "bearer";
})
.AddJwtBearer("bearer",x =>
{
    x.RequireHttpsMetadata = false;
    x.SaveToken = true;
    //x.TokenValidationParameters = tokenValidationParameters;
    x.TokenValidationParameters = new TokenValidationParameters
    {
        ValidateIssuerSigningKey = true,
        IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes("SecretKey")),
        ValidateIssuer = true,
        ValidateAudience = true,
        ValidateLifetime = true,
        ValidIssuer = Environment.GetEnvironmentVariable(MS_Jwt_Issuer),
        ValidAudience = Environment.GetEnvironmentVariable(MS_Jwt_Issuer),
        ClockSkew = TimeSpan.Zero,
    };
    x.Events = new JwtBearerEvents
    {
        OnAuthenticationFailed = context =>
        {
            if (context.Exception.GetType() == typeof(SecurityTokenExpiredException))
            {
                context.Response.Headers.Add("Token-Expired", "true");
            }
            return Task.CompletedTask;
        }
    };
});


services.AddResponseCaching();
services.AddCors(c =>
{
    c.AddPolicy("AllowOrigin", options => options.AllowAnyOrigin());
});

Вот как я устанавливаю токен:

var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes("SecretKey"));
var credentials = new SigningCredentials(key, SecurityAlgorithms.HmacSha256);
var tokenDescriptor = new SecurityTokenDescriptor
{
    Subject = new ClaimsIdentity(claims),
    Expires = DateTime.UtcNow.AddDays(10),
    SigningCredentials = credentials,
    IssuedAt = DateTime.UtcNow,
    Issuer = Environment.GetEnvironmentVariable(MS_Jwt_Issuer),
    Audience = Environment.GetEnvironmentVariable(MS_Jwt_Issuer),
};

var token = tokenHandler.CreateToken(tokenDescriptor);
var refreshToken = tokens.GenerateRefreshToken();
var processedToken = tokenHandler.WriteToken(token);

Всякий раз, когда я аутентифицируюсь, я могу правильно получить токен. Однако, когда я пытаюсь получить доступ к классу, защищенному [Authorize], я получаю следующее исключение:

Исключение: «Microsoft.IdentityModel.Tokens.SecurityTokenExpiredException» в Microsoft.IdentityModel.Tokens.dll

Вот образец моего токена. Он успешно проверяет с моим секретным ключом и дата истечения срока действия показали, собственно, и не истек:

1014 * eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJQaG9uZU51bWJlciI6IjEyMzIxMjMxMjMiLCJuYmYiOjE1ODcwNTAxOTksImV4cCI6MTU4NzkxNDE5OSwiaWF0IjoxNTg3MDUwMTk5LCJpc3MiOiJTUiIsImF1ZCI6IlNSIn0.WbEJq_PAOLvra1ZUwtQEKH9FRBDdb2byw26miUm-KE 1016 * EDIT: 1018 * При попытке вручную проверьте токен, он успешно проверен и срок его действия не истек. Но по какой-то причине [Authorize] помечает его как просроченный

Ответы [ 2 ]

0 голосов
/ 17 апреля 2020

Я использую JWT для создания токена. это работа для меня, я надеюсь, что полезно для вас

 public TokenResponse BuildToken(string username)
    {

        var now = DateTime.UtcNow;

        var claims = new Claim[]
        {
                new Claim(JwtRegisteredClaimNames.Sub, username),
                new Claim(JwtRegisteredClaimNames.Jti, Guid.NewGuid().ToString()),
                new Claim(JwtRegisteredClaimNames.FamilyName, username),
                new Claim(JwtRegisteredClaimNames.Iat, now.ToUniversalTime().ToString(), ClaimValueTypes.Integer64)
        };

        var signingKey = new SymmetricSecurityKey(Encoding.ASCII.GetBytes("Secret"));

        var jwt = new JwtSecurityToken(
            issuer: "Iss",
            audience: "Audience",
            claims: claims,
            notBefore: now,
            expires: now.Add(TimeSpan.FromDays(30)),
            signingCredentials: new SigningCredentials(signingKey, SecurityAlgorithms.HmacSha256)
        );
        var encodedJwt = new JwtSecurityTokenHandler().WriteToken(jwt);
        var responseJson = new TokenResponse
        {
            access_token = encodedJwt,
            expires_in = (int)TimeSpan.FromDays(30).TotalDays
        };

        return responseJson;
}

ConfigureServices

var authenticationProviderKey = "bearer";


        var signingKey = new SymmetricSecurityKey(Encoding.ASCII.GetBytes("Secret"));
        var tokenValidationParameters = new TokenValidationParameters
        {
            ValidateIssuerSigningKey = true,
            IssuerSigningKey = signingKey,
            ValidateIssuer = true,
            ValidIssuer = "Iss",
            ValidateAudience = true,
            ValidAudience = "Audience",
            ValidateLifetime = true,
            ClockSkew = TimeSpan.Zero,
            RequireExpirationTime = true,
        };

        services.AddAuthentication(o =>
        {
            o.DefaultAuthenticateScheme = authenticationProviderKey;
        })
        .AddJwtBearer(authenticationProviderKey, x =>
        {
            x.RequireHttpsMetadata = false;
            x.TokenValidationParameters = tokenValidationParameters;
            x.Events = new JwtBearerEvents
            {
                OnAuthenticationFailed = context =>
                {
                    if (context.Exception.GetType() == typeof(SecurityTokenExpiredException))
                    {
                        context.Response.Headers.Add("Token-Expired", "true");
                    }
                    return Task.CompletedTask;
                }
            };
        });

Настройка

 app.UseAuthentication();
 app.UseAuthorization();
0 голосов
/ 17 апреля 2020

Вы добавили промежуточное ПО UseAuthentication () в метод Configure при запуске?

...