zoukankan      html  css  js  c++  java
  • Microsoft.Owin.Security.OAuth搭建OAuth2.0授权服务端

    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的配置:

     View Code

        其中两个关于OAuth授权的实现类:

        令牌生成接收:SimpleAuthenticationTokenProvider

        授权总线:SimpleSSOOAuthProvider

     

    授权示例:

    1、使用Microsoft.Owin.Security.SimpleSSO模拟OpenID认证(authorization code模式)

    1.1、Demo展示:

     

    今天新加了Microsoft.Owin.Security.SimpleSSO组件(感兴趣的可以看下Katana项目),主要方便第三方集成SimpleSSO登录。

    SimpleTest集成登录需要完成如下代码配置:

     View Code

     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重定向代码:

     View Code

    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代码:

     View Code

      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代码:

     View Code

     

    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代码:

     View Code

    4、通过password模式申请令牌

    实现代码:

     View Code

    5、通过client credentials模式申请令牌

    实现代码:

     View Code

    后话

    写的不够清晰,建议看看源码。关于OAuth的实现集中在SimpleSSOOAuthProvider,SimpleAuthenticationTokenProvider类。系统有很多不足的地方,后续我会抽时间迭代出一个稳定版本,这次毕竟只花了几天时间。当然如果您有什么宝贵建议也可以邮件联系我。

    独立之精神,自由之思想
  • 相关阅读:
    JavaScripts广告轮播图以及定时弹出和定时隐藏广告
    JavaScript正则表达
    表单常用标签 和 属性
    html框架集
    Hbuilder 快捷键
    css 图片
    html input accept类型
    db2 sql
    js 数组排序
    html input size maxlength
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/6231521.html
Copyright © 2011-2022 走看看