我的角度应用程序正在使用文档系列
http://bitoftech.net/2014/06/01/token-based-authentication-asp-net-web-api-2-owin-asp-net-identity/中所述的承载令牌.我已经按照分叉示例在访问令牌已过期(通过401 http代码)时无缝刷新令牌.
我的问题是如何确定承载令牌是否过期或根据确定的角色是否是未经授权的?
例如,我的web api方法具有[Authorize(Roles =“Admin”)]的属性.当我打电话时,我收到我的401错误,这是预期的.但是,当我的访问令牌过期并且我进行另一个web api方法调用时,它也返回一个401错误.在我的拦截器中收到我的responseError处理程序:
responseError: function (rejection) { var deferred = q.defer(); if (rejection.status === 401) { var authService = $injector.get('authService'); authService.refreshToken().then(function (response) { _retryHttpRequest(rejection.config,deferred); },function () { authService.logout(); $location.path('/dashboard'); deferred.reject(rejection); }); } else { deferred.reject(rejection); } return deferred.promise; }
我正在玩不同的东西,但基本上,我想刷新我的令牌,并在访问令牌过期时重新发送我的请求;但是,如果由于指定的角色,它真的是拒绝请求,我不想刷新我的令牌.
有什么想法吗?
正如我对Cory Silva的评论的回应所指出的那样,Web API Authorize属性将总是返回401未授权的身份验证和授权.
原文链接:https://www.f2er.com/angularjs/142995.htmlhttp://leastprivilege.com/2014/10/02/401-vs-403/
看起来有两个选择:
>当我从localStorage中存储从我的授权服务器检索到的令牌时,我也存储令牌的到期.在拦截器responseError函数中,我将存储的令牌到期与当前的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); } } }