http://www.asp.net/aspnet/overview/owin-and-katana/owin-oauth-20-authorization-server

有示例代码

关于token的加密解密

server 端

app.UseOAuthAuthorizationServer(new OAuthAuthorizationServerOptions
{

其中AccessTokenFormat可以设置身份的序列化和加密方式,遗憾的是不能用简单的json或xml,因为有循环引用

是一个实现了ISecureDataFormat<AuthenticationTicket>的类,AuthenticationTicket 中有循环引用,所以json不能

resource端

app.UseOAuthBearerAuthentication(new Microsoft.Owin.Security.OAuth.OAuthBearerAuthenticationOptions(){
AccessTokenFormat=……
});

要设置成同样的处理方式

server端加密,resource端解密

关于Cookie中的Base64字符串

示例代码中,身份认证用的是mvc5新的identiy,而我的身份认证是自定义的(基于以前的一个网站)。cookie中存的是base64的字符,其中可能会存在加号(+)

用原本的Request.Cookie获取,加号取出来就是加号

但是通过IOwinContext取出来,+号变成了空格。

要注意对这部分进行处理

关于客户端和服务器端的交互

整个oauth,可以认为有3方

1、oauth认证服务(server)

2、api服务(resource)

3、要调用api的网站(client)

最终的目的是client获取resource的数据,但是resource的数据不是谁都可以随便取的,所以需要先经过server的认证和授权

如果用.net开发客户端和服务端,则按照例子中的,用DotNetOpenAuth.OAuth2这个,也挺方便

但我们搭建oauth,是要为其他网站服务的,不能仅适用于.net,所以有必要了解一下客户端的流程

首先,针对每一个第三方的客户端(网站或手机app之类的)都需要给他分配(或自己设定)

1、client id 字符串,能够唯一标识一个第三方应用

2、secret  对应的密钥

3、redirect uri  认证之后,认证服务会跳转会应用的页面,此页面接收返回的token

大体流程如下

1、客户端在需要认证的时候,跳转到认证服务器

http://server/OAuth/Authorize?client_id=…&redirect_uri=…&state=…&response_type=code

此时,页面会停留在认证服务器,要浏览器点确定按钮(如果没登录,会先跳转到登录页,登录后还回到这个页)

当用户点确定(同意授权)之后,会跳转会传来的redirect_uri这个参数对应的网址,

http://www.abc.com/test/authback

然后在后面会有参数

?code=….&state=….

其中state是你发给服务什么,服务就原样给你返回什么。

你可以,在发送给服务端之前,生成一些随机数,然后保存在cookie,当服务器返回后,与cookie中的比对,来确定在过程中是否有被劫持或进行过其他的改动。

code是关键性的东西,之后我们要写一些程序来向服务发起一个请求会用到此code

2、http://server/OAuth/Token发送post请求到这个地址,并且

form的值包括

redirect_uri=…&grant_type=authorization_code&code=…
其中code,就是上一步获取到的code,grant_type是固定值(这里只针对AuthorizationCodeGrant这种方式)
redirect_uri还是同样的那个地址(注意这里不能用不一样的地址,因为在注册应用的时候,只设定了这一个地址,所以对所有的返回应用的地址,都要使用这一个)
并且,要在header中传递
Authorization,值为 
 
clientid+冒号+secret(clientid+”:"+secret)
把这个结果用utf8编码方式转成base64字符串
Authorization这个header中的值为 "Basic "+base64字符串(注意有个空格)
如果一切正常,我们能够拿到一个json的返回值,包含了access token,refresh token,以及过期时间等
 
3、拿access token去api服务端获取数据
同样,我们在请求api的时候,需要设置header
Authorization 值为 "bearer "+accesstoken

关于过期时间和刷新

在第二步拿到的json,除了access token以外,还会有

expires_in 和 refresh_token

expires_in是秒

如果过期了,可以拿refresh_token重新获取一个

post请求http://server/OAuth/Token

head与第二步一样

form:

grant_type = refresh_token (固定值)

refresh_token(第二步拿到的字符串)

请求成功后,获取到json(与第二步格式一样)

server中owin的option里可以设置AuthorizationCode和AccessToken的时间,默认是5分钟和20分钟

使用ms owin 搭建oauth2 server的更多相关文章

  1. 使用 OAuth2-Server-php 在 Yii 框架上搭建 OAuth2 Server

    原文转自 http://www.cnblogs.com/ldms/p/4565547.html Yii 有很多 extension 可以使用,在查看了 Yii 官网上提供的与 OAuth 相关的扩展后 ...

  2. 使用 OAuth2-Server-php 搭建 OAuth2 Server

    Yii 有很多 extension 可以使用,在查看了 Yii 官网上提供的与 OAuth 相关的扩展后,发现了几个 OAuth2 的客户端扩展,但是并没有找到可以作为 OAuth2 Server 的 ...

  3. 使用Owin中间件搭建OAuth2.0认证授权服务器

    前言 这里主要总结下本人最近半个月关于搭建OAuth2.0服务器工作的经验.至于为何需要OAuth2.0.为何是Owin.什么是Owin等问题,不再赘述.我假定读者是使用Asp.Net,并需要搭建OA ...

  4. [2014-11-11]使用Owin中间件搭建OAuth2.0认证授权服务器

    前言 这里主要总结下本人最近半个月关于搭建OAuth2.0服务器工作的经验.至于为何需要OAuth2.0.为何是Owin.什么是Owin等问题,不再赘述.我假定读者是使用Asp.Net,并需要搭建OA ...

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

    Microsoft.Owin.Security.OAuth搭建OAuth2.0授权服务端 目录 前言 OAuth2.0简介 授权模式 (SimpleSSO示例) 使用Microsoft.Owin.Se ...

  6. Owin中间件搭建OAuth2.0认证授权服务体会

    继两篇转载的Owin搭建OAuth 2.0的文章,使用Owin中间件搭建OAuth2.0认证授权服务器和理解OAuth 2.0之后,我想把最近整理的资料做一下总结. 前两篇主要是介绍概念和一个基本的D ...

  7. ASP.NET Linux部署(2) - MS Owin + WebApi + Mono + Jexus

    ASP.NET Linux部署(2) - MS Owin + WebApi + Mono + Jexus 本文承接我的上一篇博文: ASP.NET 5 Linux部署,那篇文章主要是针对最新的ASP. ...

  8. Spring Cloud 微服务中搭建 OAuth2.0 认证授权服务

    在使用 Spring Cloud 体系来构建微服务的过程中,用户请求是通过网关(ZUUL 或 Spring APIGateway)以 HTTP 协议来传输信息,API 网关将自己注册为 Eureka ...

  9. Spring Cloud(6.2):搭建OAuth2 Client

    配置web.xml 添加spring-cloud-starter-security,spring-security-oauth2-autoconfigure和spring-boot-starter-o ...

随机推荐

  1. 【转】SQL FOR XML简介及用法

    摘要:sql中的for xml语法为表转化为xml提供了很好的支持,当然使用同样的程序语言也能够达到同样的效果,但是有了for xml将使得这一切更加的方便. 主要内容: Select 的查询结果会作 ...

  2. win10中shift+右键,在此处打开cmd窗口

    通过添加注册表项,实现右击“在此处打开命令行功能” 注册表位置:HKEY_CLASSES_ROOT\Directory\Background\shell\ win10系统用标识右键菜单打开命令行的键, ...

  3. python爬虫的页面数据解析和提取/xpath/bs4/jsonpath/正则(2)

    上半部分内容链接 : https://www.cnblogs.com/lowmanisbusy/p/9069330.html 四.json和jsonpath的使用 JSON(JavaScript Ob ...

  4. Python网络通信

    day26 网络通信 参考: http://www.cnblogs.com/yuanchenqi/articles/5692716.html 男生是client端,字条是socket(sk),通过sk ...

  5. mysql优化器在统计全表扫描的代价时的方法

    innodb 的聚集索引 的叶子结点 存放的 是 索引值以及数据页的偏移量 那么在计算全表扫描的代价是怎么计算的呢? 我们知道代价 为 cpu代价+io代价 cpu代价 就是 每5条记录比对 计算一个 ...

  6. C++命名空间、函数重载、缺省参数、内联函数、引用

    一 .C++入门 1.C++关键字 2.命名空间 3.C++输入&输出 4.缺省参数 5.函数重载 6.引用 7.内联函数 8.auto关键字 9.基于范围的for循环 10.指针空值null ...

  7. JS:事件委托

    事件委托 事件流 事件流描述的是从页面中接收事件的顺序.---JS高级程序设计(第3版) DOM Level 2 Events规定的事件流有三个阶段:①事件捕获阶段.②处于目标阶段.③事件冒泡阶段 事 ...

  8. 【BZOJ3992】【SDOI2015】序列统计 EGF+多项式快速幂+循环卷积

    如果是求$n$个数之和在模$m$意义下为$x$,那么做法是显然的. 但是这道题问的是$n$个数之积在模m意义下为$x$,那么做法就和上面的问题不同. 考虑如何把乘法转换成加法(求log): 题目中有一 ...

  9. Linux服务器快速安装可视化桌面且可以远程RDP远程连接

    我们很多网友在选择Linux服务器的时候并不是用来做网站的,有些是需要用到远程桌面安装软件或者是其他用途.但是我们知道大部分海外主机商是只有LINUX系统且没有可视化桌面,当然也有一些商家是支持安装G ...

  10. python-在定义函数时,不定长参数中,默认值参数不能放在必选参数前面

    如果一个函数的参数中含有默认参数,则这个默认参数后的所有参数都必须是默认参数,否则会报错:SyntaxError: non-default argument follows default argum ...