我的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;
}
我在玩不同的东西,但基本上,我想刷新我的令牌,并在访问令牌过期时重新发送我的请求;但是,如果由于指定的角色,令牌确实是被拒绝的请求,我不想刷新令牌。
有什么想法吗?
正如我在回答科里·席尔瓦的评论时所指出的那样,对于身份验证和授权,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-