Ответ 1
Как отмечалось в моем ответе на комментарий Кори Сильвы, атрибут авторизации Web API всегда возвращает 401, неавторизованный как для аутентификации, так и для авторизации.
См. статью и нить ниже:
http://leastprivilege.com/2014/10/02/401-vs-403/
Почему AuthorizeAttribute перенаправляет на страницу входа для проверки подлинности и авторизации?
Похоже, есть два варианта:
-
Когда я храню токен, полученный с моего сервера авторизации в localStorage, я также сохраняю срок действия маркера. В функции ответа на перехват перехватчика я сравниваю время хранения хранимого токена с текущим временем datetime. Если срок его действия истек, обновите токен и отправьте запрос повторно.
responseError: function (rejection) { var deferred = q.defer(); if (rejection.status === 401) { var tokenExpired = false; var authData = localStorage.get('authorizationData'); if (authData) { tokenExpired = moment().isAfter(authData.expiration); } if (tokenExpired) { var authService = auth;//$injector.get('authService'); authService.refreshToken().then(function (response) { _retryHttpRequest(rejection.config, deferred); }, function () { authService.logOut(); $state.go('error'); deferred.reject(rejection); }); } else { $state.go('error'); deferred.reject(rejection); } } else { $state.go('error'); deferred.reject(rejection); } return deferred.promise; }
-
Используйте принятый ответ в потоке stackoverflow, на который я ссылался выше, и создаю свой собственный атрибут AuthorizeAttribute для определения срока действия токена против несанкционированного доступа.
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = true, AllowMultiple = true)] public class AuthorizeAttribute : System.Web.Http.AuthorizeAttribute { protected override void HandleUnauthorizedRequest(HttpActionContext actionContext) { if (actionContext.RequestContext.Principal.Identity.IsAuthenticated) { actionContext.Response = actionContext.Request.CreateResponse(HttpStatusCode.Forbidden); } else { base.HandleUnauthorizedRequest(actionContext); } } }
Я думаю, что я буду использовать вариант 2, чтобы код ошибки стал немного более понятным для клиента.