2016-03-30 3 views
0

Я изучаю, как защитить приложения 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)); 

Я также заметил, что она вызывается при каждом запросе к серверу, в то время как со своими собственными вызовами атрибутов производятся только к соответствующему контроллеру, который использует мой атрибут.

  1. Мне интересно, в чем разница между двумя подходами и что является более «правильным» способом использования? Что дает лучшую безопасность?
  2. Почему я должен удалить эти строки из WebApiConfig.cs, чтобы он мог работать?
  3. Имеет ли второй метод какое-то влияние на производительность, которое не имеет первого метода?

ответ

2

2: Почему я должен удалить эти строки из WebApiConfig.cs так что это может работать?

Удаляя эти строки, он подавляет механизм аутентификации по умолчанию для хоста (т. Е. Работает с атрибутом [Authroize]) и включает собственный механизм проверки подлинности фильтра.

1: Мне интересно, в чем разница между двумя подходами и что является более «правильным» способом использования? Что дает лучшую безопасность?

Использование Asp.net [Авторизовать] предоставляет функции аутентификации по умолчанию asp.net, но путем наследования AuthorizeAttribute дает вам возможность писать собственные функции. Хотя обе дают вам безопасность, вам решать, какой из них подходит вам.

3: У второго метода есть влияние на производительность, которое не имеет первого метода?

У вас нет технической идеи, но она не должна влиять на производительность.

Смежные вопросы