3. 为授权服务器添加终结点
上面介绍OAuth时介绍了终结点实际上就是用来获取授权码或者Access Token的,在.Net中使用Microsoft.Owin.Security.OAuth组件仅需要通过配置的形式就可以指定授权码及Token获取的终结点访问地址(注:把AllowInsecureHttp配置属性设为true,可以允许不安全的http来访问终结点,该配置仅用于开发环境):
完成后就可以通过浏览器访问这两个地址:
可以看到是可以访问,只不过是有错误的(注:请求地址的QueryString的参数参考文档)。
4. Client的管理与验证Client在OAuth中指代了所有的第三方需要访问受限制资源的应用程序,授权服务器为了能够识别和验证Client所以需要完成Client的管理以及验证功能。(注:微软在Microsoft.Owin.Security.OAuth组件中仅仅提供了Client验证的接口,所以要自己实现Client数据的管理以及验证逻辑):
1). 添加Client实体以及对应的仓储(本例以内存的方式实现仓储,实际使用中至少应该保存数据库):
上图是Client最基础的属性(注:如果还需要对Client的访问范围进行限制,那么还应该加入一个Scope的列表,本例不再加入Scope的限制)。
2). Client的仓储:
3). 实现授权服务器对Client的验证:
由于授权服务器对客户端验证的接口位于OAuthAuthorizationServerProvider类型中,所以首先要继承该类型,并重载相应的验证方法:
上面代码做了以下几件事:
● 尝试从Http请求header或者请求body中获取Client信息,包含Id和密码。
● 如果没有Client的Id信息,那么直接判断为不通过验证,如果有Client的密码信息则保存到Owin上下文中,供后续处理使用。
● 使用获得的ClientId在Client仓储中查询,判断是否是一个合法的Client,如不是则判断为不通过验证。
4). 验证完成后设置该Client的重定向Url(注:该方法仍旧是重载OAuthAuthorizationServerProvider类型中的方法):
5. 添加授权码提供器
授权码的生成是授权服务器终结点的一项功能,当使用授权码模式时,用户访问Client会被引导跳转到授权服务器完成身份验证(登录),随后又携带授权码跳转回Client,Client使用该授权码获取Access Token。在OAuth的.Net实现中,需要通过在配置中配置一个类型为IAuthenticationTokenProvider的令牌提供器,该提供器用于创建和解析令牌,这里的创建实际就是用户完成登录后授权码的生成以及授权码和用户登录身份信息的关联,而解析实际就是根据授权码获得对应用户身份信息并生成Access Token的过程。
下面就通过实现IAuthenticationTokenProvider的方式实现一个自定义授权码提供器: