Безопасность .NET Core Web API - PullRequest
       66

Безопасность .NET Core Web API

0 голосов
/ 21 февраля 2019

Я новичок в ядре Web API и пытаюсь реализовать аутентификацию JWT.Я получил базовый логин с рабочим именем пользователя и паролем. Однако я получил несколько проблем

  1. Я могу использовать тот же токен, когда я звоню "api / customer"/ GetCustomerGridData "из localhost / api и размещенного приложения (например: http://test.com/api). Если токен был сгенерирован из localhost / api, почему он проверяет токен как истинный на http://test.com/api?

  2. Я установил срок действия токена на 1 час. Как обновить этот токен, если пользователь активен в течение одного часа, вместо того, чтобы перенаправить его для повторного входа в систему.

  3. Я сохраняю токен безопасности в локальном хранилище на клиенте, чтобы каждый мог его увидеть. Что если кто-то использует этот токен и сделает вызов «api / customer / GetCustomerGridData»? Он все равно будет проверять токен как истинное право?

Startup.cs

public void ConfigureServices(IServiceCollection services) //, IApplicationBuilder app
{

    // configure strongly typed settings objects
    var connectionStringSection = Configuration.GetSection("ConnectionString");
    services.Configure<ConnectionString>(connectionStringSection);
    // configure jwt authentication
    var connectionSettings = connectionStringSection.Get<ConnectionString>();

    // Add ASPNETCoreDemoDBContext services.
    services.AddDbContext<DoneITCRMTestContext>(options => options.UseSqlServer(ConnectionString.Connection));//(connectionSettings.DoneITCRMConnection));

    services.AddCors();
    services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);


    var key = Encoding.ASCII.GetBytes(AppSettings.Secret);
    services.AddAuthentication(x =>
    {
        x.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
        x.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
    })
    .AddJwtBearer(x =>
    {
        x.RequireHttpsMetadata = false;
        x.SaveToken = true;
        x.TokenValidationParameters = new TokenValidationParameters
        {
            ValidateIssuerSigningKey = true,
            IssuerSigningKey = new SymmetricSecurityKey(key),
            ValidateIssuer = false,
            ValidateAudience = false
        };
    });

    // configure DI for application services
    services.AddScoped<IAppUserService, AppUserService>();
    services.AddScoped<ICustomerService, CustomerService>();
    services.AddScoped<IAdminService, AdminService>();

}

Код для генерации токена при входе в систему:

public JwtSecurityTokenHandler GenerateToken(User user, out SecurityToken token)
{
    var tokenHandler = new JwtSecurityTokenHandler();
    var key = Encoding.ASCII.GetBytes(AppSettings.Secret);
    var tokenDescriptor = new SecurityTokenDescriptor
    {
        Subject = new ClaimsIdentity(new Claim[]
        {
            new Claim(ClaimTypes.Name, user.Id.ToString())

        }),
        //Expires = DateTime.UtcNow.AddSeconds(30),
        Expires = DateTime.UtcNow.AddHours(1),
        SigningCredentials = new SigningCredentials(new SymmetricSecurityKey(key), SecurityAlgorithms.HmacSha256Signature)
    };

    var _token = tokenHandler.CreateToken(tokenDescriptor);

    token = _token;

    return tokenHandler;
}

Метод сервера:

[Authorize(AuthenticationSchemes = "Bearer")]
[HttpGet]
public IActionResult GetCustomerGridData()
{
    int companyId = _appUserService.GetCompanyIdByUserId(Convert.ToInt32(User.Identity.Name));

    var companies = _customerService.GetCustomerGridData(companyId);

    return Ok(companies);
}
...