Как создать базовую аутентификацию в Web Api? - PullRequest
0 голосов
/ 27 марта 2019

У меня есть следующие .cs для создания базовой аутентификации в моем API. Это работает нормально, но появляется только один раз, когда я запускаю его в первый раз. Как сделать так, чтобы он появлялся снова (при каждом запуске)?

namespace CMob
{
    public class BasicAuthenticationAttribute : AuthorizationFilterAttribute
    {

    public override void OnAuthorization(HttpActionContext actionContext)
    {
        var authHeader = actionContext.Request.Headers.Authorization;

        if (authHeader != null)
        {
            var authenticationToken = actionContext.Request.Headers.Authorization.Parameter;
            var decodedAuthenticationToken = Encoding.UTF8.GetString(Convert.FromBase64String(authenticationToken));
            var usernamePasswordArray = decodedAuthenticationToken.Split(':');
            var userName = usernamePasswordArray[0];
            var password = usernamePasswordArray[1];


            var isValid = userName == "chrysa" && password == "1234";

            if (isValid)
            {
                var principal = new GenericPrincipal(new GenericIdentity(userName), null);
                Thread.CurrentPrincipal = principal;

                return;
            }
        }

        HandleUnathorized(actionContext);
    }

    private static void HandleUnathorized(HttpActionContext actionContext)
    {
        actionContext.Response = actionContext.Request.CreateResponse(HttpStatusCode.Unauthorized);
        actionContext.Response.Headers.Add("WWW-Authenticate", "Basic Scheme='Data' location = 'http://localhost:");
    }
}
}¨

Мой контроллер

 public class DController : ApiController
    {
        [BasicAuthentication]
        [Route("api/D")]
        public IEnumerable<D> Get()
        {
            using (CM_DataEntities entities = new CM_DataEntities())
            {
                return entities.Ds.ToList();
            }
        }
}

Спасибо!

Ответы [ 3 ]

0 голосов
/ 27 марта 2019

Вы должны объявить атрибут в WebApiConfig.cs:

config.Filters.Add(new BasicAuthenticationAttribute());

И вы должны украсить свои контроллеры и / или действия:

public class MyController : ApiController  
{  
  [BasicAuthentication]  
  public string Get()  
  {  
     return "Hello";  
  }  
}  
0 голосов
/ 27 марта 2019

Это на самом деле зависит от того, какое поведение вы хотите определить.Если вы хотите использовать свой фильтр аутентификации для всего API, вы можете добавить его в глобальный список фильтров следующим образом (в WebApiConfig.cs):

public static void Register(HttpConfiguration config)
{
    config.Filters.Add(new BasicAuthenticationAttribute());
}

Если вы хотите ограничить все методы контроллера, украсьте его следующим образом:

[BasicAuthentication]
public class RestrictedController : ApiController
{
   //Your controller definition
}

Конечно, вы можете использовать его для одного метода, таким образом:

[BasicAuthentication]
public JsonResult GetJsonDataAsAuthenticatedUser()
{
    //your method definition
}

Вы можете указать метод, который не требует аутентификации с украшением AllowAnonymous:

[BasicAuthentication]
public class RestrictedController : ApiController
{
   [AllowAnonymous]
   public IActionResult Authenticate()
   {
      //Your authentication entry point
   }       
}

Вы можете сослаться на эту ссылку

0 голосов
/ 27 марта 2019

"Для неаутентифицированных запросов сервер должен вернуть ответ, заголовок которого содержит статус HTTP 401 Unauthorized [4] и поле WWW-Authenticate. [5]"

Вы должны обратиться к https://en.wikipedia.org/wiki/Basic_access_authentication. Я совершенно уверен, что вы можете найти ответ, который вы ищете там.

По сути, браузер обеспечивает аутентификацию, и вы абсолютно не можете ее контролировать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...