Я изучаю, как защитить приложения ASP.NET Web Api. Я начал с Basic Authentication (да - я знаю, что это не рекомендуется, да - мой последний план - использовать аутентификацию на основе токена, но мне нужно сначала изучить и понять основы).ASP.NET WebApi v2 - Защита с помощью BasicAuthentication
Во-первых, я сделал, чтобы создать Attribute
, который наследует от AuthorizeAttribute
, и использовать его на контроллере, который я хочу защитить. Это очень простой (и работы):
public class SimpleUserNamePasswordAuthorizeAttribute : AuthorizeAttribute
{
public string UserName { get; set; }
public string Password { get; set; }
protected override bool IsAuthorized(HttpActionContext actionContext)
{
string query = actionContext.Request.RequestUri.Query;
var nvc = HttpUtility.ParseQueryString(query);
string securityQueryToken = nvc["_auth"];
if (string.IsNullOrEmpty(securityQueryToken) && actionContext.Request.Headers.Authorization == null)
{
return false;
}
string authToken = "";
if (actionContext.Request.Headers.Authorization != null)
authToken = actionContext.Request.Headers.Authorization.Parameter;
else
authToken = securityQueryToken;
if (string.IsNullOrWhiteSpace(authToken))
{
return false;
}
// Decode the token from BASE64
string decodedToken = Encoding.UTF8.GetString(Convert.FromBase64String(authToken));
if(string.IsNullOrWhiteSpace(decodedToken))
{
return false;
}
// Extract username and password from decoded token
int index = decodedToken.IndexOf(":", StringComparison.Ordinal);
if(index == -1)
{
return false;
}
string userName = decodedToken.Substring(0, decodedToken.IndexOf(":", StringComparison.Ordinal));
string password = decodedToken.Substring(decodedToken.IndexOf(":", StringComparison.Ordinal) + 1);
return ((userName == UserName) && (password == Password));
}
}
Я где-то читал, что этот способ работы является более общим для для Web Api v1. И нашел этот проект, который реализует Basic Authentication: https://github.com/IdentityModel/IdentityModel.Owin.BasicAuthentication
Из того, что я узнал, что они используют другой подход (который, кажется, более правильно), что я не нужен мой собственный Attribute
и использовать [Authorize]
, который является частью ASP .СЕТЬ.
Они делают это, наследуя AuthenticationHandler
и AuthenticationMiddleware
и используя его как промежуточное программное обеспечение Owin
. Сначала он не работал, пока я не удалил вытекающий из моих WebApiConfig.cs
в App_Start
каталоге:
config.SuppressDefaultHostAuthentication();
config.Filters.Add(new HostAuthenticationFilter(OAuthDefaults.AuthenticationType));
Я также заметил, что она вызывается при каждом запросе к серверу, в то время как со своими собственными вызовами атрибутов производятся только к соответствующему контроллеру, который использует мой атрибут.
- Мне интересно, в чем разница между двумя подходами и что является более «правильным» способом использования? Что дает лучшую безопасность?
- Почему я должен удалить эти строки из
WebApiConfig.cs
, чтобы он мог работать? - Имеет ли второй метод какое-то влияние на производительность, которое не имеет первого метода?