Web API OAUTH-区分标识令牌是否过期或未经授权

Web API OAUTH-区分标识令牌是否过期或未经授权,oauth,asp.net-web-api2,owin,Oauth,Asp.net Web Api2,Owin,我目前正在使用Owin、Oauth开发一个授权服务器 下面是我的Oauth配置,我有两个问题 OAuthAuthorizationServerOptions OAuthServerOptions = new OAuthAuthorizationServerOptions() { AllowInsecureHttp = true, TokenEndpointPath = new PathString("/token"), AccessTokenExpireTi

我目前正在使用Owin、Oauth开发一个授权服务器

下面是我的Oauth配置,我有两个问题

 OAuthAuthorizationServerOptions OAuthServerOptions = new OAuthAuthorizationServerOptions()
  {

     AllowInsecureHttp = true,
     TokenEndpointPath = new PathString("/token"),
     AccessTokenExpireTimeSpan = TimeSpan.FromSeconds(1000),
     Provider = new AuthorizationServerProvider()
     //RefreshTokenProvider = new SimpleRefreshTokenProvider()
  };
     app.UseOAuthAuthorizationServer(OAuthServerOptions);
     app.UseOAuthBearerAuthentication(new OAuthBearerAuthenticationOptions());
如果令牌已过期,并且用户使用过期的令牌访问时获得了401(未经授权)。请使用Fiddler进行检查

如何向用户发送自定义消息,说明您的令牌已过期。我需要覆盖哪个功能或模块

我的另一个问题是,下面这条线有什么用

使用OAuthBeareAuthentication(新的OAuthBeareAuthenticationOptions());
我真的需要实现它吗?因为当我检查时,它仍然可以在没有上述行的情况下工作。任何安全违规行为?

您不能直接自定义过期令牌的行为,但可以使用自定义中间件来实现

首先覆盖
AuthenticationTokenProvider
,以便您可以在身份验证票证过期之前拦截它

公共类CustomAuthenticationTokenProvider:AuthenticationTokenProvider
{
公共覆盖无效接收(AuthenticationTokenReceiveContext上下文)
{
DeserializeTicket(context.Token);
if(context.Ticket!=null&&
context.Ticket.Properties.ExpiresUtc.HasValue&&
context.Ticket.Properties.ExpiresUtc.Value.LocalDateTime
并在启动时将其与一个小型定制中间件一起配置

使用AppFunc=System.Func;
使用OAuthAuthorizationServer(OAuthServerOptions);
app.useAuthBeareAuthentication(新的OAuthBeareAuthenticationOptions()
{
AccessTokenProvider=新的CustomAuthenticationTokenProvider()
});
//在请求是否经过身份验证之后
//检查我们的自定义环境设置,并采取相应措施
应用程序使用(新函数(下一步=>(环境)=>
{
var ctx=新文本(env);
if(ctx.Get(“custom.ExpriredToken”))
{
//你想得到什么样的回答
ctx.Response.StatusCode=401;
ctx.Response.ReasonPhrase=“Token exprired”;
//使用此中间件终止请求
返回Task.FromResult(0);
}
其他的
{
//继续中间件管道的其余部分
返回下一个(env);
}
}));
如果您注意到我在调用
useAuthBeareAuthentication
之后放置了自定义中间件,这一点很重要,并且源于对第二个问题的回答

OAuthBeareAuthenticationMidleware负责身份验证,但不负责授权。因此,它只是读取令牌并填充信息,以便稍后在管道中使用
iaauthenticationmanager
访问它


所以,是的,无论有没有它,您的所有请求都将显示为401(未经授权),即使是那些具有有效令牌的请求。

完美解决方案,为我节省了大量时间!