OAuth2学习及DotNetOpenAuth部分源码研究.docx

上传人:lao****ou 文档编号:653427 上传时间:2024-03-19 格式:DOCX 页数:30 大小:82.67KB
下载 相关 举报
OAuth2学习及DotNetOpenAuth部分源码研究.docx_第1页
第1页 / 共30页
OAuth2学习及DotNetOpenAuth部分源码研究.docx_第2页
第2页 / 共30页
OAuth2学习及DotNetOpenAuth部分源码研究.docx_第3页
第3页 / 共30页
OAuth2学习及DotNetOpenAuth部分源码研究.docx_第4页
第4页 / 共30页
OAuth2学习及DotNetOpenAuth部分源码研究.docx_第5页
第5页 / 共30页
亲,该文档总共30页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

《OAuth2学习及DotNetOpenAuth部分源码研究.docx》由会员分享,可在线阅读,更多相关《OAuth2学习及DotNetOpenAuth部分源码研究.docx(30页珍藏版)》请在第一文库网上搜索。

1、0Auth2学习及DotNetOpenAuth部分源码研究二 .0AUth2中的角色0Auth2有四种角色authorizationSerVer授权服务器:对资源所有者进行认证,认证通过后,向客户端发放AccessToken(访问令牌)。三 .认证过程用户访问客户端的网站,想操作自己存放在资源服务提供方的资源。客户端将用户引导至授权服务提供方的授权页面请求用户授权,在这个过程中将客户端的回调连接发送给授权服务提供方。用户在授权服务提供方的网页上输入用户名与密码,然后授权该客户端访问所请求的资源。授权成功后,授权服务提供方对客户端授予一个授权码,网站跳回至客户端。客户端获得授权码后,再次从授权服

2、务提供方请求获取访问令牌。授权服务提供方根据授权码授予客户端访问令牌。客户端使用获取的访问令牌访问存放在资源服务提供方上的受保护的资源。四 .获取访问令牌方式从上面能够看到,令牌是串起整个认证流程的核心QAUth2有四种获取令牌的方式AuthorizationCode授权码方式:这种是推荐使用的,也是最安全的.本文要紧讲解第一种获取方式.有能有些人有这样的疑问,为什么授权成功后不直接返回访问令牌,则是获取授权码,然后使用授权码去换访问令牌.这个问题的答案在官方的文档里,原因要紧是保障数据安全性.当用户授权成功,浏览器从授权服务器返回客户端时,数据是通过QUeryString传递的.假如直接返回

3、访问令牌,则直接在地址栏可见,有关的日志系统也会记录,这会提高令牌被破解的风险.返回授权码,然后客户端通过直接通信使用授权码换取访问令牌,整个过程对用户是不可见的,这样大大提高了安全性.E-DotNetOpenAuth在OA1Hh2中的应用官方Samp1e内包含有OAIJth的完整示例,其授权服务器使用Mvc编写,客户端与资源服务器使用WebForm编写,数据层使用了EF.为了更加贴进实际使用,减少无关杂音,本人模仿其重写了一个SamP1e,本文的讲解将围绕自行编写的Samp1e展开.Samp1e示例可于文后下载.1.客户端生成客户端代理后,第一件事就是应该访问授权服务器获取授权码.这要紧由W

4、ebServerCIient类的RequestUserAuthorization方法完成.pub1icvoidRequestUserAuthorization(IEnumerab1escope=nu11,UrireturnTo=nu11);在申请授权码时,还会向授权服务器发送申请权限的范围,参数名叫SCoPe.通常都是一个Ur1地址.申请成功,授权服务器返回后,客户端需再次访问授权服务器申请访问令牌.这要紧由WebSerVerC1ient类的PrOCeSSUSerAUthoriZation方法完成成功申请后,会返回一个IAUthOriZationState接口对象淇定义如下stringAcce

5、ssTokenget;set;DateTime?AccessTokenExpirationUtcget;set;DateTime?AccessTokenIssueDateUtcget;set;UriCa11backget;set;stringRefreshTokenget;set;HashSetScopeget;很好懂得,AccessToken为访问令牌,RefreshToken为刷新令牌,AccessTokenIssueDateUtc为访问令牌生成时间,AccessTokenExPirationUtc为访问令牌过期时间,Ca11back为回调的UrIjScope为权限的范围,或者者叫被授权能

6、够访问的地址范围.在Samp1e中为了简化编程对框架作了二次封装,如下前12行为对象初始化,14至J18行将获取的权限对象储存在Session中,属性名为AUthOriZatie)n.客户端使用GetUserAuthorization方法来获取对某地址访问授权.在页面中调用代码如下打开页面,首次调用GetUSerAUthOriZatiOn方法后,首先推断权限对象AU懵OriZatiOn是否为空.不为空说明已获取到权限.为空则执行ProcessUserAuthorization方法获取访问令牌,由于如今没有授权码,则返回的权限对象为空.最后通过Request1JserAuthorization方

7、法向授权服务器申请授权码.第三次执行GetUserAuthorization方法,由于权限对象Authorization已不为空,则直接返回.访问令牌默认是有的时候效的.当过期后,要么走上面三步重新申请一个令牌,只是更好的方法是使用刷新令牌刷新访问令牌.这要紧由WebServerCIient类的RefreshAuthorization方法完成pub1icboo1RefPeshAuthorization(IAuthorizationStateauthorizationTimeSpan?Skip1fusefu11ifeExceeds=nu11);在Samp1e中针对Wcf请求作了二次封装,如下2.

8、授权服务端服务端要紧围绕下列对象编程AuthorizationServer类,代表授权服务类.要紧的功能都由它提供.IAuthorizationServerHost接口是编写验证逻辑的地方,由C)AUth2AuthorizationServerICryptoKeyStore是访问密码的接口,INonceStore是访问随机数的地方,这两个接口由DatabaseKeyNonceStore类实现JC1ientDeSeriPtiOn是描述客户端的接口,由C1ient实现.在本Samp1e中Qpen1d与OAUth2是配合使用的.用户需要先去OPen1d进行登录,然后去OAUth2进行授权.从这个意义

9、上讲QAUth2受OPen1d的统一管理,是其一个客户端.AccountControIIer是一个典型的OPenId客户端编程.上篇文章已有讲解,故不赘述.当客户端申请授权码时,首先执行OAUthCOntrOIIer类的Authorize方法,如下,有删节A1JthOriZatiOnSerVer类的ReadAUthOriZatic)nRequest方法会获取用户请求并返回一个EndUSerAUthOriZatiOnReqUeSt对象,此对象定义如下pub1icUriCa11backget;set;pub1icstringC1ientIdentifierget;set;pub1icstringC

10、1ientStateget;set;pub1icvirtua1EnduserAuthorizationResponseTypeResponseTypeget;pub1icHashSetScopeget;此方法是查找数据库中有无此客户端记录且密码不为空,假如不为空且处于获取授权码阶段,则会调用了ISAU懵OriZatiOnVaIid方法privateboo1IsAuthorizationVa1id(HashSetPequestedScopes,stringC1ientIdentifierjDateTimeissUedUtc,stringusername)issuedUtc+=TimeSpan.F

11、romSeconds(1);database.AddParameter(nQC1ientIdentifier,c1ientidentifier);database.AddParameter(00CreatedOnUtc,issuedUtc);database.AddParameter(ExpirationDateUtc,DateTime.UtcNow);database.AddParameter(OpenIDC1aimedIdentifier,username);StringBui1dersb=newStringBui1der();sb.Append(se1ectscopefromuseru)

12、;sb.Append(joinC1ientAuthorizationcaonu.userid=ca.useridn);sb.Append(njoinC1ientconc.c1ientid=ca.C1ientid,);sb.Append(wherec.C1ientIdentifier=C1IentIdentifier);sb.Append(,andCreatedOnUtc=EXpirationDateUtc),);sb.Append(andu.OpenIDC1aimedIdentifier=0OpenIDC1aimedIdentifier,);DataTab1edt=database.Execu

13、teDataSet(sb.ToString().Tab1esO;if(dt.Rows.Count=O)returnfa1se;vargrantedScopes=newHashSet(OAuthUti1ities.ScopeStringComparer);foreach(DataRowdrindt.Rows)grantedScopes.UnionWith(OAuthUti1ities.Sp1itScopes(drscope.ToString();returnrequestedScopes.IsSubsetOf(grantedScopes);能够看到,此方法查找指定用户在指定客户端上是否有对目标范

14、围的授权,且没有过期.也就是说,假如客服端的密码不能为空,且当前用户在此客户端上对目标范围还有未过期的授权,则自动发放授权码.回到最初的Authorize方法.假如能够自动发放授权码,则调用AuthorizationServer类的PrepareApproveAuthorizationRequest方法生成一个授权码,并通过AuthorizationServer类Channe1属性的PrepareResponse方法最终返回给客户端.假如不能自动发放,则浏览器会跳转到一个确认页面,如下图所示We1come:http:/1oca1host:5250user.aspBob1ogOffAuthori

15、ze是否授权Web4访问以下地址http:/tempuri.org/IGetData/Name1engthYesINo:点击后执行OAUtheontro11er类的AuthorizeResponse方法,有删节.pub1icActionResu1tAuthorizeResponse(boo1isApproved)varpendingRequest=this.authorizationserver.ReadAuthorizationRequest();IDirectedprotoco1Messageresponse;if(isApproved)database.AddParameter(nSC1ientIdentifiernzpendingRequest.C1ientidentifier);intC1ientId=Convert.ToInt32(database.ExecuteSca1ar(se1ectc1ient1dfromc1ientwhereC1ientIdentifier=0C1ientIdentifier);database.AddParameter(OpenIDC1aimed

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 应用文档 > 工作总结

copyright@ 2008-2022 001doc.com网站版权所有   

经营许可证编号:宁ICP备2022001085号

本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有,必要时第一文库网拥有上传用户文档的转载和下载权。第一文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知第一文库网,我们立即给予删除!



客服