在web.config中配置<httpModules>指定到自己写的一个dll,这个类用来获取令牌保存本地cookie和创建forms认证。(主站的令牌存在在主站的一个数据库表中,用来作为登陆的用户日志)
这个dll首先会生成一个guid用来到主站点获取密钥加密的后缀。根据返回回来的密钥调用主站点的webserver的方法,根据这个密钥参数返回用户判断是否为空,如果为空就跳转登录,反之跳转到指定页面中。(这里dll生成的guid只是用来主站和子站点的一个安全契约,而主站获取过来的GUid才作为webserver的查询),在通过返回过来的用户名调用webserver查询这个用户名的角色给到forms cookies
主站登录会根据跳转过来的密钥参数值,对cooke进行赋值。
用户的信息会再登陆的时候根据cookie保存的key进行对表中的所有用户记录查询出来,放入System.Collections.ObjectModel.KeyedCollection<string, Iitem>中进行存放。然后当你进入页面的时候,只需要根据cookie中存放的key对KeyedCollection查找就行了,(此处使用单列模式,这样就不需要网数据库查询了,减少数据库压力)如果有就返回name,没有就返回"";(或者登陆的时候看看KeyedCollection里面是否有这个用户,如果有就更改一下过期时间,反之就保存一条到keyedCollection里面)。
主站退出时会对KeyedCollection集合进行删除,然后退出Forms认证,当实例一条用户进入集合时,会做个定时器,后台开启一个线程,每隔4个小时查看集合中的用户是否过期,过期就进行从集合中删除。
1、本地生成一个guid并保存cookie,如果没登陆就把这个带到主站点,然后主站点生成一个cookie的token+传过来的Guid进行拼接
2、如果登陆成功将token的值保存到redis缓存中,在redis已token做一个主键对象记录用户信息,
3、每次登陆通过token加用户双方约定契约来进行调用主站点的用户信息
4、当B站点访问的时候,直接返回主站Cookie的token,流程和前面一样
baseToken 6aa76595cb2144d8a4619b4c2d7f0b8c 首先本地需要弄一个随机guid,以区分是本地请求过去的,然后在将主站生成的密钥进行拼接 newToken+baseToken返回给客户端
tempToken =newToken+baseToken 他是用来记录可能第一次根据token没有获取到用户信息,然后为了第二次请求
remoteToken =主站返回的密钥=newToken+baseToken