Я нахожусь в точке, где я проектирую свою безопасность API, и я собирался использовать собственный атрибут, я не хочу использовать сторонние системы, поскольку они стоят денег.
Я собирался использовать клиент id и секретный id подход, и я спрашиваю, является ли это достаточно безопасным способом выполнения sh, если я взаимодействую с моим API через слой базы данных.
Итак, первое, что будет вызвано, это этот бит кода, который выходит, чтобы найти совпадение с БД и затем вызывается контроллером
public bool FindKeysByClientIdByApiKey(Guid apiKey, Guid clientId)
{
ApiKeys results = new ApiKeys();
using (var connection = new SqlConnection(constr))
{
return connection.Query<ApiKeys>($"SELECT * FROM {schemaDefination}.[ApiKeys] where ClientId= @ClientId and ApiKey=@ApiKey and isActive=1 and isDeleted!=1",
new { ApiKey = apiKey, ClientId = clientId }).Any();
}
}
Код контроллера
public class ApiKeysController : ControllerBase
{
DBContext db = new DBContext();
[HttpGet]
public int Get(Guid ApiKey, Guid ClientdId)
{
if (!db.FindKeysByClientIdByApiKey(ApiKey, ClientdId)) {
return StatusCodes.Status401Unauthorized;
}else
return StatusCodes.Status200OK;
}
}
Чтобы включить или отключить это по желанию, я создаю пользовательский Атрибут, который будет иметь следующий вид:
public async Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next)
{
//before
if(!context.HttpContext.Request.Headers.TryGetValue(ApiKeyHeaderName, out var potentialApiKey))
{
context.Result = new UnauthorizedResult();
return;
}
// before
if (!context.HttpContext.Request.Headers.TryGetValue(ClientId, out var potentialClientId))
{
context.Result = new UnauthorizedResult();
return;
}
var getConfigurationResult = Do Stuff here
await next();
//after
}
Это должно означать, что я могу просто вызвать атрибут на моем контроллере, если бы этот метод работал нормально. Я предполагаю, что этот метод также позволит мне украшать мои Gets и Puts, чтобы гарантировать, что они также разрешают то, что я должен возвращать в ApiControllers, чтобы я мог сделать его более обобщенным c
[Apikey]