Owin + WebApi + OAuth2 搭建授权模式(授权码模式 Part I)

 最近想要整理自己代码封装成库,也十分想把自己的设计思路贴出来让大家指正,奈何时间真的不随人意。

  想要使用 OWIN 做中间件服务,该服务中包含 管线、授权 两部分。于是决定使用 webapi 、OAuth2 来做。

  在搭建途中,几乎是步步遇坎,由于对 OAuth2 内部流转的不了解,在网上到处找大牛的文献介绍,也整理不少,最后贴出。

  在捋顺出验证整个内部过程后,遇到了如何使用 js 来发送请求达到验证,以及解决了遇到的跨域问题。

  目前仅整理出了 授权码模式 ,闲言少叙,说说自己的理解吧。

 

1. 授权码理论,此部分摘要网上介绍较为详细的贴图

 

1.1 结合例子来说,当我们与某网站进行合作,需要得到他们的授权信息,在双方协商后,确立了

  1.1.1 http://127.0.0.1:10000 对方授权地址

  1.1.2 grant_type : authorization_code 授权码模式

  1.1.3 response_type : code 授权类型

  1.1.4 client_id : lightxun 客户端ID

  1.1.5 redirect_uri : http://localhost:58632 返回接收 authorization_code 的地址

  1.1.6 state : login 状态,我用来做标识当前请求状态

1.2 当我们在某网站进行登录时,会可以快捷的使用QQ、微博等账号进行授权登录。那么我们第一步点击登录方式,页面会调转到 对方授权地址,同时携带以上参数,最终获得授权码,触发【A】Authorization Request

<a href="http://127.0.0.1:10000/authorize?grant_type=authorization_code&response_type=code&client_id=lightxun&redirect_uri=http://localhost:58632/&state=login" target="_blank">authorize</a>

 

  1.2.1  在某网站后台授权中 首先进行验证被注册的重定向url, 此处我的做法,在其内部将传来的 client_id 与 之前协商的 client_id 进行对比,如无误,则通过验证之前协商的 redirect_uri,为了安全,防止钓鱼,该方法对应为 OpenAuthorizationServerProvider 下的 ValidateClientRedirectUri 方法。此类为继承于 OAuthAuthorizationServerProvider ,并重写其中几部重要的处理方法。

复制代码
/// <summary>/// 验证 redirect_uri, 用于验证被注册的跳转Url /// </summary>public override async Task ValidateClientRedirectUri(OAuthValidateClientRedirectUriContext context) {   //验证uri 为了安全,防钓鱼  if(context.ClientId == OpenAuthorizationClients.Client.Id)   {     //将传来的redirectUri 与 参数验证对比, 所以该参数最好取自数据库    context.Validated(OpenAuthorizationClients.Client.RedirectUri);   } }
复制代码

 

  1.2.2 在通过了上面的方法验证后,会验证 authorization_code 请求,该方法对应为 OpenAuthorizationServerProvider 下的 ValidateAuthorizeRequest 方法

复制代码
/// <summary>/// 验证 authorization_code 的请求 /// </summary>public override async Task ValidateAuthorizeRequest(OAuthValidateAuthorizeRequestContext context) {   // IsAuthorizationCodeGrantType : 如果“response_type”查询字符串参数为“code”,则为 True   // IsImplicitGrantType : 如果“response_type”查询字符串参数为“token”,则为 True  if (context.AuthorizeRequest.ClientId == OpenAuthorizationClients.Client.Id &&     (context.AuthorizeRequest.IsAuthorizationCodeGrantType || context.AuthorizeRequest.IsImplicitGrantType))   {     // 满足以上条件, 标记为已验证    context.Validated();    }   else   {     context.Rejected();   } }
复制代码

 

  1.2.3 接着开始处理 authorization_code 请求,来生成授权码,该过程当中整理了一下逻辑,通过 state 来判断当前请求的状态, 如果是 login 则证明需要登录,登录后会将state修改为 validate 并重新发送验证请求。如果是 validate 则说明已成功登录,可以生成授权码了。该方法对应为 OpenAuthorizationServerProvider 下的 AuthorizeEndpoint 方法

复制代码

                        
关键字:
50000+
5万行代码练就真实本领
17年
创办于2008年老牌培训机构
1000+
合作企业
98%
就业率

联系我们

电话咨询

0532-85025005

扫码添加微信