Microsoft.Owin.Security.OAuth搭建OAuth2.0授权服务端
Microsoft.Owin.Security.OAuth搭建OAuth2.0授权服务端
目录
前言
OAuth2.0简介
授权模式 (SimpleSSO示例)
使用Microsoft.Owin.Security.SimpleSSO模拟OpenID认证
通过authorization code授权模式申请令牌
通过implicit授权模式申请令牌
通过password模式申请令牌
通过client credentials模式申请令牌
后话
前言
之前有分享这个项目源码及简介,不过因为文字讲解太少,被和谐了。我重新总结下:


源码:https://github.com/zhoufeihong/SimpleSSO
OAuth 2.0协议:http://www.rfcreader.com/#rfc6749
-------------------------------------------分割线
记得那个酷热的夏天,面试官翘着二郎腿问:“知道单点登录不?”,我毫不迟疑答到:“不就是限制用户只能在一个地方登录吗!”。面试完回家,查资料,也是似懂非懂,COOKIE、跨域、令牌、主站都是些啥玩意!
其实我就是个VS都没摸过几次的毕业生,单点登录这种玩意是不是太高级了。
这次就是写个项目练练手(这两年手生了太多),想到当初在网上找了半天,关于单点登录、OAuth 2.0也没找到个完整的实例(概念、理论倒是比较多),就写了这个项目。分享出来,希望可以给那些对单点登录、OAuth 2.0实现比较困惑的C#开发人员一些帮助。同时项目里面有对于Autofac、AutoMapper、EF等等技术实践方式(当然复制了很多代码,我会尽量把源项目的License放上),希望在这些技术上也可以给你一些参考,项目可以直接运行(用户名:admin密码:123)。
昨天的文章因为文字讲解太少了,被和谐了。不得不佩服博客园管理人员的专业水平,是你们如此细致的工作造就了博客园这么多优秀的文章,也造就了博客园的今天(拍个马屁)。其实我就想贴几张图,你们看到效果后,自己去看代码、敲代码,这样子会比较好些(其实我就是表达能力不好,怕词不达意)。
废话不多说了,这篇文章我简单介绍下:
SimpleSSO授权第三方应用系统获取用户信息(OpenID认证)(类似于我们在新浪上点击QQ快捷登录,采用的授权码模式(authorization code))
SimpleSSO授权基于浏览器应用系统获取用户信息(类似于我们通过微信浏览器点开第三方应用,采用的简化模式(implicit))
第三方系统使用用户名密码申请获取用户令牌,然后用令牌获取用户信息(采用的密码模式(password))
第三方系统申请自己的访问令牌(类似于微信公众号用申请令牌访问自己公众号信息(采用的客户端模式client credentials))
第三方系统刷新用户(本身)令牌(refreshtoken)
OAuth2.0简介
OAuth2.0(开放授权)是一个开放标准,允许用户让第三方应用访问该用户在某一网站上存储的私密的资源,而无需将用户名和密码提供给第三方应用。具体你可以去百度(oauth2.0 阮一峰),文章关于oauth2.0理论的讲解非常到位,网上的理论也非常多,之前没有基础的可以先去脑补下。
具体场景:QQ用户在XX网站分享文章到QQ空间
剖析:

授权模式 (SimpleSSO授权示例)
前言:
关于授权模式如果不太清楚的建议:去百度(oauth2.0 阮一峰),文章关于对于授权模式的讲解非常到位。Owin.OAuth的基础,可以看看dudu写的在ASP.NET中基于Owin OAuth使用Client Credentials Grant授权发放Token,一篇一篇看下去。
本节主要演示SimpleSSOTest站点通过各种授权模式到SimpleSSO站点申请令牌。如图:

其中SimpleSSO站点为:http://localhost:8550,SimpleTest站点为:http://localhost:6111,后续会用到。
SimpleSSO关于OAuthAuthorizationServerOptions的配置:
其中两个关于OAuth授权的实现类:
令牌生成接收:SimpleAuthenticationTokenProvider
授权总线:SimpleSSOOAuthProvider
授权示例:
1、使用Microsoft.Owin.Security.SimpleSSO模拟OpenID认证(authorization code模式)
1.1、Demo展示:


今天新加了Microsoft.Owin.Security.SimpleSSO组件(感兴趣的可以看下Katana项目),主要方便第三方集成SimpleSSO登录。
SimpleTest集成登录需要完成如下代码配置:
1.2、Demo请求流程(流程图工具过期了,只能用文字了,省略了很多细节):
1)用户点击“使用Microsoft.Owin.Security.SimpleSSO模拟OpenID认证”下进入按钮,将跳转到http://localhost:6111/login/authsimplesso
2)authsimplesso接收用户请求
1>如果用户已经使用ExternalCookie在登录,注销ExternalCookie信息,获取返回用户信息。
2>当用户未登录,则将http返回状态改为401,并且创建authenticationType为SimpleSSOAuthentication身份验证,SimpleSSOAccountAuthenticationHandler将用户重定向到http://localhost:8550/GrantCode/Authorize?client_id={0}&scope={1}&response_type=code&redirect_uri={2}&state={3}。
SimpleSSOAccountAuthenticationHandler重定向代码:
3)GrantCode/Authorize接收用户请求
1>如果为可信应用则不需要用户同意,直接生成code让用户跳转到http://localhost:6111/login/signin-simplesso?code={0}&state={1}
2>如果不是可信应用则跳转到http://localhost:8550/OAuth/Grant用户授权页面,用户点击授权时跳转到
4)http://localhost:6111/login/signin-simplesso?code={0}&state={1}请求处理,由SimpleSSOAccountAuthenticationHandler类处理
SimpleSSOAccountAuthenticationHandler代码:
1>使用code获取令牌
2>获取用户信息
3>SignIn(ExternalCookie)
4>重新跳转到http://localhost:6111/login/authsimplesso,回到1.2-2)
2、通过authorization code授权模式申请令牌
2.1、Demo展示(这个demo请求实际上是可以跨域的):

2.2、Demo请求流程
1)用户点击“通过authorization code授权模式申请令牌”下进入按钮,使用div加载url地址http://localhost:8550/GrantCode/Authorize?client_id=1&scope=user-base&response_type=code&redirect_uri=http://localhost:6111/api/Code/App1&state={随机}。如果用户没有登录的情况下请求这个路径,会跳转到登录界面。
2)因为client_id=1应用为可信应用,所以直接生成code,请求http://localhost:6111/api/Code/App1?code=?&state={请求过来的值}
由SimpleSSOOAuthProvider方法AuthorizeEndpoint完成可信应用验证,用户令牌信息注册,SimpleAuthenticationTokenProvider完成code生成
3)/api/Code/App1接收code、state
1)使用code获取Access_Token
2)使用Access_Token获取用户信息
3)使用Refresh_Token刷新Access_Token
4)使用刷新后的Access_Token获取用户信息
/api/Code/App1代码:
3、通过implicit授权模式申请令牌
3.1、Demo展示:

implicit模式是比较特别一种模式,由基于浏览器应用访问用户信息,所以生成的令牌直接为Access_Token,且Url为http://localhost:6111/TokenClient/ShowUser#access_token={0}&token_type={1}&state={2},浏览器端需要通过window.location.hash访问。
3.2、Demo请求流程
1)用户点击""下进入,http://localhost:8550/GrantCode/Authorize?client_id=2&redirect_uri=http://localhost:6111/TokenClient/ShowUser&response_type=token&scope=user_base&state={随机}
2)跳转到用户授权页面,用户授权后,返回http://localhost:6111/TokenClient/ShowUser#access_token={0}&token_type=bearer&state={2}
3)点击Try Get Data,js使用access_token请求获取用户信息。
其中JS代码:
4、通过password模式申请令牌
实现代码:
5、通过client credentials模式申请令牌
实现代码:
后话
写的不够清晰,建议看看源码。关于OAuth的实现集中在SimpleSSOOAuthProvider,SimpleAuthenticationTokenProvider类。系统有很多不足的地方,后续我会抽时间迭代出一个稳定版本,这次毕竟只花了几天时间。当然如果您有什么宝贵建议也可以邮件联系我。
Microsoft.Owin.Security.OAuth搭建OAuth2.0授权服务端的更多相关文章
- SimpleSSO:使用Microsoft.Owin.Security.OAuth搭建OAuth2.0授权服务端
目录 前言 OAuth2.0简介 授权模式 (SimpleSSO示例) 使用Microsoft.Owin.Security.SimpleSSO模拟OpenID认证 通过authorization co ...
- 使用DotNetOpenAuth搭建OAuth2.0授权框架
标题还是一如既往的难取. 我认为对于一个普遍问题,必有对应的一个简洁优美的解决方案.当然这也许只是我的一厢情愿,因为根据宇宙法则,所有事物总归趋于混沌,而OAuth协议就是混沌中的产物,不管是1.0. ...
- Spring Security实现OAuth2.0授权服务 - 进阶版
<Spring Security实现OAuth2.0授权服务 - 基础版>介绍了如何使用Spring Security实现OAuth2.0授权和资源保护,但是使用的都是Spring Sec ...
- Spring Security实现OAuth2.0授权服务 - 基础版
一.OAuth2.0协议 1.OAuth2.0概述 OAuth2.0是一个关于授权的开放网络协议. 该协议在第三方应用与服务提供平台之间设置了一个授权层.第三方应用需要服务资源时,并不是直接使用用户帐 ...
- 使用DotNetOpenAuth搭建OAuth2.0授权框架——Demo代码简单说明
前段时间随意抽离了一部分代码作为OAuth2的示例代码,若干处会造成困扰,现说明如下: public class OAuthController : Controller { private stat ...
- nodejs实现OAuth2.0授权服务
OAuth是一种开发授权的网络标准,全拼为open authorization,即开放式授权,最新的协议版本是2.0. 举个栗子: 有一个"云冲印"的网站,可以将用户储存在Goog ...
- zabbix系列(一)centos7搭建zabbix3.0.4服务端及配置详解
1.安装常用的工具软件 yum install -y vim wget centos7关闭防火墙 systemctl stop firewalld.service systemctl disable ...
- 分享一个单点登录、OAuth2.0授权系统源码(SimpleSSO)
SimpleSSO 关于OAuth 2.0介绍: http://www.ruanyifeng.com/blog/2014/05/oauth_2_0.html 系统效果: 登录界面: 首页: 应用界面: ...
- 扩展 Microsoft.Owin.Security
微软在 OWIN 框架中对 OAuth 认证的支持非常好, 使用现有的 OWIN 中间件可以做到: 使用 Microsoft.Owin.Security.OAuth 搭建自己的 OAuth2 服务端, ...
随机推荐
- Android 自动生成的R类
资源文件的使用分为在代码中使用和在其他资源文件中引用该资源文件.在我们编译一个Android应用时,Android会自动生成一个R类,在该类中根据不同的资源类型又生成了相应的内部类,该类包含了系统中使 ...
- jQuery 更改checkbox的状态,无效
今天写页面遇到复选框动态全选或全不选问题,正常写法如下: $("#tb").find("input[type='checkbox']").attr(" ...
- EventBus使用详解(一)
一.概述 EventBus是一款针对Android优化的发布/订阅事件总线.主要功能是替代Intent,Handler,BroadCast在Fragment,Activity,Service,线程之间 ...
- Javascript之旅——第一站:从变量说起
工作这几年,js学的不是很好,正好周末有些闲时间,索性买本<js权威指南>,大名鼎鼎的犀牛书,好好的把js深入的看一看.买过这本 书的第一印象就是贼厚,不过后面有一半部分都是参考手册. 一 ...
- java.lang.OutOfMemoryError处理错误
内存详解 原因: 常见的有以下几种: 1.内存中加载的数据量过于庞大,如一次从数据库取出过多数据: 2.集合类中有对对象的引用,使用完后未清空,使得JVM不能回收: 3.代码中存在死循环或循环产生过多 ...
- php反射机制
PHP5添加了一项新的功能:Reflection.这个功能使得phper可以reverse-engineer class, interface,function,method and extensio ...
- Altium Designer 出现错误提示(警告)adding items to hidden net GND/VCC
一般出现这个提示,不是错误. 可以取消net 网格标号 这样就不会报这个警告了. 还可以设置规则,不让它报告. 点击确定,但是再次打开工程时有得警告这个错误了.我想,还是取消NET标注.
- ELF Format 笔记(五)—— 特殊 Section
ilocker:关注 Android 安全(新入行,0基础) QQ: 2597294287 链接器把一些独立的 object files 和库文件链接起来,形成可执行文件.在这个过程中,链接器需要解决 ...
- shell编程入门
背景知识 Shell 是用户与内核进行交互操作的一种接口,是 Linux 最重要的软件之一.目前最流行的 Shell 称为 bash Shell,bash Shell 脚本编程以其简洁.高效而著称,多 ...
- 大话设计模式C++版——简单工厂模式
简单工厂模式应该是所有设计模式中最简单,也最基础的一种模式,以下是一个简单的采用工厂模式写一个加减法的计算器. 1.抽象接口类——依赖倒转原则(高层和底层都要依赖于抽象,针对接口编程) class I ...