2016-03-09 2 views
2

Я пытаюсь реализовать политику истечения срока действия пароля и нашел хороший blog showing an example - но это в MVC. Я пытаюсь реализовать его для WebApi2. Я ожидал, что WebApi будет иметь аналогичную функциональность, но до сих пор не удалось найти правильные пространства имен/методы для вызова.Как реализовать атрибут AuthorizationContext на WebApi?

Соответствующая часть кода:

public override void OnAuthorization(AuthorizationContext filterContext) 
{ 
    if (!filterContext.ActionDescriptor.IsDefined(typeof(SkipPasswordExpirationCheckAttribute), inherit: true) 
     && !filterContext.ActionDescriptor.ControllerDescriptor.IsDefined(typeof(SkipPasswordExpirationCheckAttribute), inherit: true)) 
     { 
      ... 

      if (timeSpan.Days >= _maxPasswordAgeInDay) 
      { 
       ... 

       filterContext.HttpContext.Response.Redirect(urlHelper.Action("ChangePassword", "Account", new { reason = "passwordExpired" })); 
      } 
     } 

    base.OnAuthorization(filterContext); 
} 
  1. На WebAPI, метод коррекции подписи OnAuthorization(HttpActionContext actionContext) вместо (AuthorizationContext filterContext) - как я могу проверить SkipPasswordExpirationAttribute с помощью ActionContext?

  2. Как только я решил, что срок действия пароля истек, какое действие следует предпринять? Я не думаю, что я могу «перенаправить» пользователя из WebApi, поскольку это не имеет никакого смысла.

ответ

2

Используйте ActionDescriptor или ControllerContext свойства искать нужный атрибут.

Вот пример проверки SkipPasswordExpirationAttribute.

public override void OnAuthorization(HttpActionContext actionContext) { 
    var attribute = actionContext.ActionDescriptor.GetCustomAttributes<SkipPasswordExpirationAttribute >(true).FirstOrDefault(); 
    if (attribute != null) 
     return; 
    //You have access to the Request and Response as well. 
    var request = actionContext.Request; 
    var response = actionContext.Response; 

    //...Once you decide the password has expired, 
    //update the response with an appropriate status code 
    //and response message that would make sense 
    //to the client that made the request 
    response.StatusCode = (int)System.Net.HttpStatusCode.Unauthorized; 
    response.ReasonPhrase = "Password expired"; 

    base.OnAuthorization(actionContext); 
}