场景如下:
1.使用web api Authentication 认证,模式使用密码模式,产生Token进行请求验证;
2.目前集群两台服务器A | B;
3.用户在第一次请求的时候,使用的A 服务器资源,产生了Token;第N+1 次请求的资源到了B 服务器,问题就出现了,因A 服务器资源未同步Token 至 B 服务器,导致出现401 错误?
问题:
1.服务器A 与 服务器B 如何实现Token 的同步?
2.Web API Authentication 所产生的Token,目前好像无法拿到?
急,等大神解答一下,万分感谢!
应该要有一个统一的token验证服务器。或者你的api服务器验证机制要一致。
比如:token验证服务器独立出来,比如api都去你的数据库查询token验证
现在的情况是这样的,.net 中的web api auth,在请求的时候是把token输出给了客户端,客户端请求的是/token 这个post 请求,但是在web api auth 中的继承:OAuthAuthorizationServerProvider 这个基类的GrantResourceOwnerCredentials中得不到当前token,只有返回客户端才行,如果是这种情况,单独部署认证服务,这个token 得不到,集群部署也存在该问题了,能否得到在服务端得到这个token呢?
这个token不放缓存或数据库?
分布式部署,请一定要使用分布式缓存作为Token存储。比较常用的是Redis。
现在的情况是这样的,.net 中的web api auth,在请求的时候是把token输出给了客户端,客户端请求的是/token 这个post 请求,但是在web api auth 中的继承:OAuthAuthorizationServerProvider 这个基类的GrantResourceOwnerCredentials中得不到当前token,只有返回客户端才行,如果是这种情况,单独部署认证服务,这个token 得不到,集群部署也存在该问题了,能否得到在服务端得到这个token呢?
@Gaven.xue: 不要用这个认证。或者你严格按照oauth走。
第一次 登入的时候。服务器为每个用户产生唯一的key。 保存起来 一般都是用redis 。每一次返回的时候把这个key简称(Token)
输出到客户端 。客户端每一次请求的时候带上Token 。
几月OAuth2的用户名密码模式生产的Token吗?如果是,看看是否可以配置Token为jwt格式的,这样服务器就不需要存储token了。
配置为jwt 格式,集群部署时会自动实时同步token?
@Gaven.xue: jwt不在服务器存,是解密jwt获取用户信息。
你应该需要在web.config中配置相同的machineKey能正常解密出来。
两台OAuth 认证服务器,修改对应的machineKey为一致,Token 就会自动同步识别吗?
@Gaven.xue: 是的。每台电脑的machineKey不同一样,所以不同机器生成的token 无法通用。
1. 如果token是随机生成的,建议将生成的token放到缓存中,比如redis,每次判断都通过从缓存取,对效率的影响也不大。不过这种方案要求缓存服务器的稳定性很高,一般做成集群,至少有个主备。
2. 如果你的token是使用加密的方法生成的,你可以在不同服务器上使用相同的密钥解密就行了。我们公司有个系统的用户登录验证就是这么做的,这种方法的好处就是不依赖其他的服务。