2015-03-31 9 views
3

Я внедрил пользовательский атрибут AuthorizeAttribute в своем WebAPI (обратите внимание, что это отличается от MVC AuthorizeAttribute).Как настроить System.Web.Http.AuthorizeAttribute с помощью Microsoft.Owin.Security?

Я переопределил метод OnAuthorization. В этом методе я проверяю, аутентифицирован ли пользователь. Если не аутентифицирован, я прошу пользователя войти в систему.

Часть моей пользовательской логики заключается в проверке аутентифицированных пользователей, если они разрешены для продолжения (в основном я проверяю их имя/адрес электронной почты, если он существует в предопределенном списке, тогда у них есть доступ).

Проблема, которую я вижу, такова: После того, как пользователь успешно аутентифицирует, НО ОТКАЗЫ, которые будут разрешены, я вижу, что на страницу входа существует бесконечное перенаправление цикла.

Опять же, проблема для учетных данных пользователя находится в методе OnAuthorization. Что может вызывать этот бесконечный цикл и как предотвратить это, как только пользователь определил, что у него нет авторизации?

* Обновлен фрагмент кода *

public override void OnAuthorization(System.Web.Http.Controllers.HttpActionContext actionContext) 
{ 
    base.OnAuthorization(actionContext); // Should this be here? 

    var owinContext = HttpContext.Current.GetOwinContext(); 
    var authenticated = owinContext.Authentication.User.Identity.IsAuthenticated; 
    var request = System.Web.HttpContext.Current.Request; 

    if (!authenticated) 
    {  
     // Challenge user for crednetials 
     if (!request.IsAuthenticated) 
     { 
      // This is where the user is requested to login. 
      owinContext.Authentication.Challenge(
       new AuthenticationProperties { RedirectUri = "/" }, 
       WsFederationAuthenticationDefaults.AuthenticationType); 
     } 
    } 
    else 
    { 
     // At this point the user ia authenticated. 
     // Now lets check if user is authorized for this application. 
     var isAuthorized = SecurityHelper.IsUserAuthorized(); 
     if (isAuthorized) 
     { 
      // authorized. 
      return; 
     } 

     // not authorized. 
     actionContext.Response = new System.Net.Http.HttpResponseMessage(System.Net.HttpStatusCode.Unauthorized); 
    } 
} 

ответ

1

Я интересно об этом кусочке кода прямо здесь:

actionContext.Response = new HttpResponseMessage(HttpStatusCode.Unauthorized); 

Где вы должны быть настраиваете ваш Owin слой, используя что-то вроде следующего :

var cookieAuthenticationOptions = new CookieAuthenticationOptions 
    { 
     LoginPath = new PathString(loginPath) 
    } 

app.UseCookieAuthentication(cookieAuthenticationOptions); 

Когда вы возвращаете 4 01 из фильтра проверки подлинности инфраструктура OWIN автоматически переадресует вас на все, что вы указали в LoginPath. Но при попытке удовлетворить этот запрос он вызывает ваш фильтр, но поскольку пользователь не авторизован, он возвращает 401, что вызывает перенаправление на LoginPath и т. Д. И т. Д.

Поскольку это вызов API, вам необходимо обрабатывать 401 по-разному. Следующая запись в блоге рассказывает об этой ситуации.

http://brockallen.com/2013/10/27/using-cookie-authentication-middleware-with-web-api-and-401-response-codes/

В двух словах, при настройке CookieAuthenticationOptions вам необходимо указать свой собственный Provider и только направить, если это не запрос AJAX.

var cookieAuthenticationOptions = new CookieAuthenticationOptions 
    { 
     LoginPath = new PathString(loginPath), 
     Provider = new CookieAuthenticationProvider() 
     { 
      OnApplyRedirect = context => 
      { 
       if (!context.Request.IsAjaxRequest()) 
       { context.Response.Redirect(context.RedirectUri); } 
      } 
     } 
    } 
+0

У меня нет явного метода входа. Вызов входа вызывает вызов из метода OnAuthorization. Пользователи могут легко войти в систему после запроса. Проблема заключается в том, что после входа в систему они затем решили не иметь авторизации/доступа. Именно в этот момент начинается цикл. – AlvinfromDiaspar

+0

Вам нужно будет обновить свой вопрос с помощью кода из пользовательского авторизованного атрибута. –

1

Вы можете попробовать удалить OnAuthorization и добавив следующее:

protected override bool IsAuthorized(HttpActionContext actionContext) 
{ 
    var owinContext = HttpContext.Current.GetOwinContext(); 
    var authenticated = owinContext.Authentication.User.Identity.IsAuthenticated; 

    return authenticated & SecurityHelper.IsUserAuthorized(); 
} 

Я не понимаю, почему вы перенаправлять на неудачной аутентификации, безусловно АНИ должен просто вернуть 401?

+0

Редирект для успешного входа в систему. – AlvinfromDiaspar

+0

Если я удалю переопределение OnAuthorization, где должен вызываться вызов Challenege? – AlvinfromDiaspar

+0

Итак, один из нас в замешательстве ...api не должен перенаправляться на страницу входа в систему или тому подобное, он должен просто вернуть 401 «Не авторизовано», а затем ответственность клиента заключается в том, чтобы перейти на конечную точку входа и войти в систему, прежде чем пытаться снова ... это как я создал много систем и не слышал ничего другого –