当前位置: 首页 > 知识库问答 >
问题:

确定无记名令牌是否已过期或刚刚授权

赖鸿羲
2023-03-14

我的angular应用程序使用了系列文章中概述的承载令牌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;
        }

我在玩不同的东西,但基本上,我想刷新我的令牌,并在访问令牌过期时重新发送我的请求;但是,如果由于指定的角色,令牌确实是被拒绝的请求,我不想刷新令牌。

有什么想法吗?

共有1个答案

谭仰岳
2023-03-14

正如我在回答科里·席尔瓦的评论时所指出的那样,对于身份验证和授权,Web API Authorize属性将始终返回401 unauthorized。

请参阅以下文章和线程:

http://leastprivilege.com/2014/10/02/401-vs-403/

为什么AuthorizeAttribute重定向到登录页面以进行身份验证和授权失败?

看起来有两种选择:

>

  • 当我将从授权服务器检索到的令牌存储在localStorage中时,我还存储令牌的过期时间。在interceptor responseError函数中,我将存储的令牌过期时间与当前日期时间进行比较。如果确定已过期,请刷新令牌并重新发送请求。

    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,以便客户端更清楚地了解错误代码。

  •  类似资料:
    • 目前在我的团队的web应用程序中,我们在一个名为Auth:“dfdfdf ...”的头中传递访问令牌.我们使用AWS Lambda和令牌授权器来访问我们的API网关资源。 还有一种不同类型的承载令牌头:授权:承载:通过Javascript发送授权令牌承载 区别是专有/命名,还是亚马逊的令牌授权人在功能上与承载令牌模式不同?

    • assertEquals(“Amsterdam,Noord-Holland”,Driver.FindElement(by.id(“van”)).getText()); 然而,这导致: org.junit.comparisonfailure:预期:<[荷兰阿姆斯特丹]>但实际:<[]> 所以看起来比较失败是正确的,但我不知道为什么我不能断言我在屏幕上看到的东西。 我正在使用Java、Selenium

    • 问题内容: 有谁知道如何修理它。我正在使用Mac OS 10.8.2 问题答案: 在Python 3中是一个函数;它应该是: 正确安装或使用新版本(如果存在错误)。 在Python 3.3上工作正常。

    • 我已经阅读了跑道文档。我特别考虑了以下关于使用的声明: 此请求返回与上述相同的数据,您可以继续反复执行此操作,以保持应用程序的身份验证,而无需要求用户重新身份验证。 这是否意味着将无限期有效或过期: < li >签发后X天;或者 < li >最后一次使用它获取新的< code>access_token后的X天 编辑:请参阅此跑道线程,该线程提出相同的问题,但似乎没有给出任何关于Oauth2.0协议

    • 任何人都可以帮助或建议我应该坚持什么,以便能够代表用户发布-一旦他们从服务或控制台应用程序给了我们许可。 提前谢了。

    • 我们正在使用JMeter对使用Azure AAD身份验证的门户进行负载测试,该门户目前因此问题而失败: {"error":"invalid_grant "," error _ description ":" aadsts 70008:提供的授权码或刷新令牌由于不活动已过期。为此用户和资源发送新的交互式授权请求。\ r \ n trace ID:e4af 3a 0a-84cc-4f7e-854 f-