ASP.NET Core. Защита jwt токенов

395
15 декабря 2017, 00:29

Я использую в своем проекте jwt токены. Код для создания ClaimsIdentity:

public async Task<ClaimsIdentity> GetClaimsIdentityAsync(User user)
{
    var roles = await _roleService.GetUserRolesAsync(user);
    var claims = new List<Claim>
    {
        new Claim(ClaimsIdentity.DefaultNameClaimType, user.Username),
    };
    foreach (var role in roles)
    {
        claims.Add(new Claim(ClaimsIdentity.DefaultRoleClaimType, role.Name));
    }
    ClaimsIdentity claimsIdentity =
        new ClaimsIdentity(claims, "Token", ClaimsIdentity.DefaultNameClaimType,
            ClaimsIdentity.DefaultRoleClaimType);
    return claimsIdentity;
}

Код для создания токена:

public async Task<string> GetJwtToken(User user)
{
    var identity = await _sinInService.GetClaimsIdentityAsync(user);
    var now = DateTime.UtcNow;
    var jwt = new JwtSecurityToken(
        issuer: AuthOptions.ISSUER,
        audience: AuthOptions.AUDIENCE,
        notBefore: now,
        claims: identity.Claims,
        expires: now.Add(TimeSpan.FromMinutes(AuthOptions.LIFETIME)),
        signingCredentials: new SigningCredentials(AuthOptions.GetSymmetricSecurityKey(), SecurityAlgorithms.HmacSha256));
    return new JwtSecurityTokenHandler().WriteToken(jwt);
}

Код в классе Startup:

services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
    .AddJwtBearer(options =>
    {
        options.RequireHttpsMetadata = false;
        options.TokenValidationParameters = new TokenValidationParameters
        {
            ValidateIssuer = true,
            ValidIssuer = AuthOptions.ISSUER,
            ValidateAudience = true,
            ValidAudience = AuthOptions.AUDIENCE,
            ValidateLifetime = true,
            IssuerSigningKey = AuthOptions.GetSymmetricSecurityKey(),
            ValidateIssuerSigningKey = true,
        };
    });

Код был взят из этой статьи: https://metanit.com/sharp/aspnet5/23.7.php

Получив строку токена можно авторизоваться с любого браузера или устройства. Как сделать так, чтобы токен был валидным только при использовании его с устройством, ip адресом и браузером, с которых была произведена авторизация?

Answer 1

Сервер знает о клиенте только то, что клиент прислал ему в http-запросе.

По сути, это только:

  • Client IP, который может меняться.
  • UserAgent, который неуникален.

Так что ответ - провалидировать привязку токена к девайсу не получится.

READ ALSO
Вызов функции из dll написанной на Delphi из C#

Вызов функции из dll написанной на Delphi из C#

Есть DLL написанная на DelphiИсходников от нее у меня нет

319
Как сжать List&lt;byte&gt;

Как сжать List<byte>

Во что лучше сжать List, чтобы передать по RPC unity - как таковой list по RPC не передать

261
Xamarin.Forms - Как удалить элемент из ListView

Xamarin.Forms - Как удалить элемент из ListView

В общем есть часть кода, которая использует ListViewНадо каким-то образом удалить элемент из ListView так, чтобы сразу строка удалилась

421
Умножение многочленов

Умножение многочленов

Добрый деньНеобходимо переопределить операцию умножения для класса полином

249