Microsoft.Owin.Security.OAuth搭建OAuth2.0授权服务端

目录

前言

  之前有分享这个项目源码及简介,不过因为文字讲解太少,被和谐了。我重新总结下:

   源码: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授权服务端的更多相关文章

  1. SimpleSSO:使用Microsoft.Owin.Security.OAuth搭建OAuth2.0授权服务端

    目录 前言 OAuth2.0简介 授权模式 (SimpleSSO示例) 使用Microsoft.Owin.Security.SimpleSSO模拟OpenID认证 通过authorization co ...

  2. 使用DotNetOpenAuth搭建OAuth2.0授权框架

    标题还是一如既往的难取. 我认为对于一个普遍问题,必有对应的一个简洁优美的解决方案.当然这也许只是我的一厢情愿,因为根据宇宙法则,所有事物总归趋于混沌,而OAuth协议就是混沌中的产物,不管是1.0. ...

  3. Spring Security实现OAuth2.0授权服务 - 进阶版

    <Spring Security实现OAuth2.0授权服务 - 基础版>介绍了如何使用Spring Security实现OAuth2.0授权和资源保护,但是使用的都是Spring Sec ...

  4. Spring Security实现OAuth2.0授权服务 - 基础版

    一.OAuth2.0协议 1.OAuth2.0概述 OAuth2.0是一个关于授权的开放网络协议. 该协议在第三方应用与服务提供平台之间设置了一个授权层.第三方应用需要服务资源时,并不是直接使用用户帐 ...

  5. 使用DotNetOpenAuth搭建OAuth2.0授权框架——Demo代码简单说明

    前段时间随意抽离了一部分代码作为OAuth2的示例代码,若干处会造成困扰,现说明如下: public class OAuthController : Controller { private stat ...

  6. nodejs实现OAuth2.0授权服务

    OAuth是一种开发授权的网络标准,全拼为open authorization,即开放式授权,最新的协议版本是2.0. 举个栗子: 有一个"云冲印"的网站,可以将用户储存在Goog ...

  7. zabbix系列(一)centos7搭建zabbix3.0.4服务端及配置详解

    1.安装常用的工具软件 yum install -y vim wget centos7关闭防火墙 systemctl stop firewalld.service systemctl disable ...

  8. 分享一个单点登录、OAuth2.0授权系统源码(SimpleSSO)

    SimpleSSO 关于OAuth 2.0介绍: http://www.ruanyifeng.com/blog/2014/05/oauth_2_0.html 系统效果: 登录界面: 首页: 应用界面: ...

  9. 扩展 Microsoft.Owin.Security

    微软在 OWIN 框架中对 OAuth 认证的支持非常好, 使用现有的 OWIN 中间件可以做到: 使用 Microsoft.Owin.Security.OAuth 搭建自己的 OAuth2 服务端, ...

随机推荐

  1. UIPickerView简单应用

    下面是一些效果图 下面是代码.有些枯燥 , 其实并不难 . #import <UIKit/UIKit.h> @interface ViewController : UIViewContro ...

  2. jQuery添加options点击事件并传值

    说明: 根据选择不同店铺选项,上送不同id值,展示不同商品列表   var formStr = "{'supplierId':'供应链企业|%-jm-sprt-%|93794498-3'}& ...

  3. MongoDB-安装&启动

    MongoDB安装 使用的版本为3.0,虚拟机操作系统为rhel-server-7.0-x86_641. 将mongodb-linux-x86_64-rhel70-3.0.11.tgz上传并解压到 / ...

  4. u盘安装CENTOS后,启动missing operating system ,只能用U盘才能启动系统

    好久之前就想把家里闲置的那台老的不能再老的笔记本换成linux的,用来学习 从N久之前用光盘安装的时候发现光驱坏掉了之后就没有再装过,最近又想安装于是就试了U盘安装 U盘安装过程也很简单,只需要制作一 ...

  5. Oracle global database name与db link的纠缠关系

    ORACLE数据库中Global Database Name与DB LINKS的关系还真是有点纠缠不清,在说清楚这个关系前,我们先来了解一下Global Database Name的概念 Global ...

  6. javascript-建造者模式

    建造者模式笔记 1.工厂模式主要是为了创建对象实例或者类簇(抽象工厂),关心的是最终产出(创建)的是什么,不关心你创建的整个过程,仅仅需要知道你最终创建的结果 2.建造者模式目的也是为了创建对象,但是 ...

  7. DNS 原理入门

    导读 DNS 是互联网核心协议之一.不管是上网浏览,还是编程开发,都需要了解一点它的知识.本文详细介绍DNS的原理,以及如何运用工具软件观察它的运作.我的目标是,读完此文后,你就能完全理解DNS. 一 ...

  8. 四、Android学习第四天——JAVA基础回顾(转)

    (转自:http://wenku.baidu.com/view/af39b3164431b90d6c85c72f.html) 四.Android学习第四天——JAVA基础回顾 这才学习Android的 ...

  9. C++ 中指针与引用的区别

    指向不同类型的指针的区别在于指针类型可以知道编译器解释某个特定地址(指针指向的地址)中的内存内容及大小,而void*指针则只表示一个内存地址,编译器不能通过该指针所指向对象的类型和大小,因此想要通过v ...

  10. HTML 头部标记

    HTML头部标记放在<head></head>中,一般包括标题.基底信息.元信息等. <base>        当前文档的URL全称(基底网址) <base ...