У меня есть приложение Angular 8 + Asp.Core и добавлена аутентификация JWT в существующей базе данных пользователей. Я хочу использовать один контроллер Api для внешнего доступа (сайт PHP), но не для всех контроллеров. Как создать второй токен и предоставить ему доступ только для одного контроллера?
Простое решение - отправить ключ безопасности с данными запроса и проверить, существует ли этот ключ в базе данных, но я не знаю, какбезопасный это
мой текущий код:
public void ConfigureServices(IServiceCollection services)
{
.............
var appSettings = appSettingsSection.Get<UserSettings>();
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,
ValidateLifetime = true,
ClockSkew = TimeSpan.Zero
};
});
}
[Authorize]
public class OtherController : Controller
{....
контроллер входа:
[AllowAnonymous]
public class LoginController : Controller
{
private readonly Entities db;
private readonly UserSettings appSettings;
public LoginController(Entities _db, IOptionsSnapshot<UserSettings> _appSettings)
{
db = _db;
appSettings = _appSettings.Value;
}
[Route("/api/login")]
[HttpPost]
public IActionResult Login([FromBody] LoginData logindata)
{
var user = db.HT_USERS
.SingleOrDefault(u => u.USERNAME == logindata.Username &&
DecryptString128Bit(u.PASSW, "passwkey") == logindata.Password);
if (user == null)
{
return NotFound();
}
else
{
var tokenHandler = new JwtSecurityTokenHandler();
var key = Encoding.ASCII.GetBytes(appSettings.Secret);
var tokenDescriptor = new SecurityTokenDescriptor
{
Subject = new ClaimsIdentity(new Claim[]
{
new Claim(ClaimTypes.NameIdentifier , user.ID.ToString())
}),
Expires = DateTime.UtcNow.AddDays(7),
SigningCredentials = new SigningCredentials(
new SymmetricSecurityKey(key),
SecurityAlgorithms.HmacSha256Signature)
};
var token = tokenHandler.CreateToken(tokenDescriptor);
var tokenString = tokenHandler.WriteToken(token);
return Ok(new
{
username = user.NAME,
token = tokenString
});
}
}
}