从上面代码可以看出这个提供器的核心功能是以Guid的方式生成一个键值(授权码)保存了当前用户的信息,当解析时通过该键值(即授权码)获取用户身份信息。(注:AuthenticationTokenCreateContext对象用于对当前用户身份信息AuthenticationTicket对的的序列化和反序列化)
完成后将该提供器配置到授权服务器中间件中:
6. 为授权服务器添加用户授权提示页面
当用户访问授权码终结点时理应让用户知道Client需要他的授权,为此在ASP.NET MVC程序中需要添加一个路由与授权码终结点地址匹配的Controller、Action以及View:
1). Controller及Action(注:该Action需要通过身份验证,如果没有需要跳转到登录页面完成身份验证后才可访问):
2). View:显示授权提示
7. 运行程序
1). 访问授权码终结点获取授权码::59273/oauth2/authorize?response_type=code&client_id=test1
由于没有登录,所以先跳转到登录页面。
完成登录后跳转回授权页面:
点击授权按钮后,携带授权码跳转到test1这个client的重定向Url(注:此处test1这个Client设置的Url就是授权服务器本身,所以看上去没有做重定向)
得到授权码后,携带授权码访问Access Token终结点获取Access Token(注:这里使用Chrome浏览器的Postman拓展来实现请求的模拟):
注:上面响应信息中的access_token包含了加密后用户的身份信息,其加密过程可参考基于Cookie的用户信息加密过程。ASP.NET没有魔法——ASP.NET Identity的加密与解密
实现基于Access Token的身份验证上面介绍了如何基于授权码模式获得Access Token,接下来将介绍如何使用Access Token来访问受限制的资源(注:本例中的资源服务器与授权服务器位于同一实例中,所以当资源服务器对access token解密时,能够保证与授权服务器用于生成access token所用密钥一致,能够正常解密,这里的Access Token和基于Cookie的身份验证中的身份验证Cookie性质是相同的,都是将用户的身份信息序列化后的加密字符串)
1. 在Startup类中添加基于Bearer的OAuth身份验证中间件:
2. 添加访问受限制的资源:
3. 访问受限资源:
未添加授权信息直接跳转到登录页面。
添加Access Token后可正常访问资源:
加入Refresh Token支持