Я новичок в ядре Web API и пытаюсь реализовать аутентификацию JWT.Я получил базовый логин с рабочим именем пользователя и паролем. Однако я получил несколько проблем
Я могу использовать тот же токен, когда я звоню "api / customer"/ GetCustomerGridData "из localhost / api и размещенного приложения (например: http://test.com/api). Если токен был сгенерирован из localhost / api, почему он проверяет токен как истинный на http://test.com/api?
Я установил срок действия токена на 1 час. Как обновить этот токен, если пользователь активен в течение одного часа, вместо того, чтобы перенаправить его для повторного входа в систему.
Я сохраняю токен безопасности в локальном хранилище на клиенте, чтобы каждый мог его увидеть. Что если кто-то использует этот токен и сделает вызов «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);
}