Идентификатор клиента безопасности Api и секретный идентификатор asp. net ядро - PullRequest
0 голосов
/ 03 апреля 2020

Я нахожусь в точке, где я проектирую свою безопасность 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]

...