我是这个论坛的新手,我希望专家们能给我很多帮助,我们有一个用C#实现OWIN身份验证的项目,我们有用于UI的内部工具(用旧的角度语言javascript(,似乎有很多缺陷,下面是一些问题。
-
如果访问令牌过期,并且有一个访问受保护资源的调用,这里的调用不会完成,那么我们如何在使用刷新令牌生成新的访问令牌后使该调用完成,这需要在UI或服务端处理,任何代码指针?
-
在UI中的访问令牌到期间隔之前使用刷新令牌生成访问令牌是一种好的做法吗?
-
Api也被windows服务使用,所以如果访问令牌过期,并且服务使用过期令牌访问任何Api,它将抛出未经授权的问题,但同样的问题是如何动态创建令牌并完成调用。
任何关于这方面的帮助,都将非常棒,因此,等待您的回复,示例代码如下所示。
public class SimpleRefreshTokenProvider : IAuthenticationTokenProvider
{
private static ConcurrentDictionary<string, AuthenticationTicket> _refreshTokens = new ConcurrentDictionary<string, AuthenticationTicket>();
public async Task CreateAsync(AuthenticationTokenCreateContext context)
{
var guid = Guid.NewGuid().ToString();
_refreshTokens.TryAdd(guid, context.Ticket);
// hash??
context.SetToken(guid);
}
public async Task ReceiveAsync(AuthenticationTokenReceiveContext context)
{
AuthenticationTicket ticket;
if (_refreshTokens.TryRemove(context.Token, out ticket))
{
context.SetTicket(ticket);
}
}
public void Create(AuthenticationTokenCreateContext context)
{
throw new NotImplementedException();
}
public void Receive(AuthenticationTokenReceiveContext context)
{
throw new NotImplementedException();
}
}
// Now in my Startup.Auth.cs
OAuthOptions = new OAuthAuthorizationServerOptions
{
TokenEndpointPath = new PathString("/api/token"),
Provider = new ApplicationOAuthProvider(PublicClientId,UserManagerFactory) ,
AuthorizeEndpointPath = new PathString("/api/Account/ExternalLogin"),
AccessTokenExpireTimeSpan = TimeSpan.FromMinutes(2),
AllowInsecureHttp = true,
RefreshTokenProvider = new RefreshTokenProvider() // This is my test
};
1(我真的不能提供任何代码指针,因为我不知道你的Angular版本,但到目前为止,我做这件事的方式是为你的请求提供某种拦截器。它查找来自API的任何未授权状态代码,缓存请求,尝试命中刷新令牌端点,并使用新的访问令牌重新发送缓存的请求(如果刷新请求成功(;如果刷新请求失败,则要求用户再次验证。
您还可以尝试实现一个拦截器,该拦截器检查访问令牌的到期日期,并在还剩5分钟的有效期时命中刷新令牌端点。
2( 我认为刷新令牌通常用于已经过期的访问令牌。
3( 我不知道你对这些Windows服务有多大的控制权,但据我所知,刷新令牌流应该在客户端处理。