Web API在OWIN下实现OAuth
OAuth(Open Authorization)
为用户资源的授权提供了一个安全的、开放而又简易的标准。与以往的授权方式不同之处是OAuth的授权不会使第三方触及到用户的帐号信息(如用户名与密码),即第三方无需使用用户的用户名与密码就可以申请获得该用户资源的授权,因此OAuth是安全的。
本节目录:
Owin下WebAPI SelfHost
1.创建一个控制台项目(其实类库都可以)ApiServer
Nuget引用:
Install-Package Microsoft.AspNet.WebApi.OwinSelfHost
或者引用以下三个
Install-Package Microsoft.AspNet.WebApi.Owin (让WebApi作为中间件)
Install-Package Microsoft.Owin.Hosting (Hosting接口默认使用HttpListener作为Server)
Install-Package Microsoft.Owin.Host.HttpListener (默认的Server实现)
2.添加Startup类
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
public void Configuration(IAppBuilder app){ // 有关如何配置应用程序的详细信息,请访问 http://go.microsoft.com/fwlink/?LinkID=316888 ApiConfig(app);}private static void ApiConfig(IAppBuilder app){ var config = new HttpConfiguration(); config.Routes.MapHttpRoute( name: "DefaultApi", routeTemplate: "api/{controller}/{action}/{id}", defaults: new { id = RouteParameter.Optional , action = RouteParameter.Optional } ); app.UseWebApi(config);} |
如何让Owin关联到Startup类的方法,可以看我的博客:
[ASP.NET] 下一代ASP.NET开发规范:OWIN
3.创建一个Api控制器
|
1
2
3
4
5
6
7
|
public class ValuesController : ApiController{ public string Get() { return "Never、C"; }} |
4.Main方法启动
|
1
2
3
4
5
6
7
8
9
|
static void Main(string[] args){ using (WebApp.Start<Startup>(url)) { Console.WriteLine("开启成功"); Console.ReadLine(); }} |
5.浏览器访问

创建AccessToken
在上面的Owin Web API的基础上,开始实现OAuth.
Nuget:
Install-Package Microsoft.Owin.Security.OAuth(owin的oauth的实现)
使用OAuth会要求Owin使用UseOAuthBearerTokens认证方式,所以引用
Install-Package Microsoft.AspNet.Identity.Owin
1.在Startup添加一个中间件配置
|
1
2
3
4
5
6
7
8
9
10
11
|
private static void OAuthConfig(IAppBuilder app) { var OAuthOptions = new OAuthAuthorizationServerOptions { TokenEndpointPath = new PathString("/token"), Provider = new OTWAuthorizationServerProvider(), AccessTokenExpireTimeSpan = TimeSpan.FromDays(14), AllowInsecureHttp = true, }; app.UseOAuthBearerTokens(OAuthOptions); } |
并且设置Web API使用OAuth
|
1
2
|
config.Filters.Add(new HostAuthenticationFilter(OAuthDefaults.AuthenticationType)); //添加的配置app.UseWebApi(config); |
2.自定义的provider
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
public class OTWAuthorizationServerProvider : OAuthAuthorizationServerProvider{ //1.验证客户 public override Task ValidateClientAuthentication(OAuthValidateClientAuthenticationContext context) {<br> //此处可以判断client和user <br> //this.ClientId = clientId; //this.IsValidated = true; //this.HasError = false; context.Validated("自定义的clientId"); return base.ValidateClientAuthentication(context); } //授权客户 public override Task GrantClientCredentials(OAuthGrantClientCredentialsContext context) { var ticket = new AuthenticationTicket(new ClaimsIdentity(new[] { new Claim(ClaimTypes.Name, "Never、C") }, context.Options.AuthenticationType), null); //this.Ticket = ticket; //this.IsValidated = true; //this.HasError = false; context.Validated(ticket); return base.GrantClientCredentials(context); }} |
3.用客户端来调用我们的(建议不要用单元测试,此处新建一个控制台项目)
|
1
2
3
4
5
6
7
|
static void Main(string[] args){ var client = new HttpClient(); var rst = client.PostAsync(url + "token", new StringContent("grant_type=client_credentials")).Result.Content.ReadAsStringAsync().Result; Console.WriteLine(rst);} |
4.先启动服务端,再启动客户端

使用AccessToken
1.ValuesController添加特性Authorize
|
1
2
3
4
5
6
7
8
|
[Authorize]public class ValuesController : ApiController{ public string Get() { return User.Identity.Name; }} |
访问会返回
{"Response status code does not indicate success: 401 (Unauthorized)."}
2.客户端引用
Install-Package Newtonsoft.Json -Version 7.0.1
3.修改Main方法,带上Token
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
class Program{ static void Main(string[] args) { var client = new HttpClient(); var rst = client.PostAsync(url + "token", new StringContent("grant_type=client_credentials")).Result.Content.ReadAsStringAsync().Result; var obj = JsonConvert.DeserializeObject<Token>(rst); client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", obj.AccessToken); rst = client.GetStringAsync(url + "api/values").Result; Console.WriteLine(rst); Console.ReadLine(); }}public class Token{ [JsonProperty("Access_Token")] public string AccessToken { get; set; }} |
4.先启动服务端,再启动客户端

扩展
其实OAuth自己也能实现,本质是生成一个加密的唯一的字符串
OAuth的实现方案还有DotNetOpenAuth、Thinktecture IdentityServer
本文地址:http://neverc.cnblogs.com/p/4970996.html
参考:
http://bitoftech.net/2014/06/01/token-based-authentication-asp-net-web-api-2-owin-asp-net-identity/
http://www.cnblogs.com/dudu/p/4569857.html
Web API在OWIN下实现OAuth的更多相关文章
- [ASP.NET] 结合Web API在OWIN下实现OAuth
OAuth(Open Authorization) 为用户资源的授权提供了一个安全的.开放而又简易的标准.与以往的授权方式不同之处是OAuth的授权不会使第三方触及到用户的帐号信息(如用户名与密码), ...
- ASP.NET Web API与Owin OAuth:调用与用户相关的Web API
在前一篇博文中,我们通过以 OAuth 的 Client Credential Grant 授权方式(只验证调用客户端,不验证登录用户)拿到的 Access Token ,成功调用了与用户无关的 We ...
- ASP.NET Web API与Owin OAuth:使用Access Toke调用受保护的API
在前一篇博文中,我们使用OAuth的Client Credential Grant授权方式,在服务端通过CNBlogsAuthorizationServerProvider(Authorization ...
- 为IIS Host ASP.NET Web Api添加Owin Middleware
将OWIN App部署在IIS上 要想将Owin App部署在IIS上,只添加Package:Microsoft.OWIN.Host.SystemWeb包即可.它提供了所有Owin配置,Middlew ...
- ASP.NET Web API与Owin OAuth:调用与用户相关的Web API(非第三方登录)
授权完成添加属性 ClaimsIdentity oAuthIdentity = await CreateAsync(user/*userManager*/, OAuthDefaults.Authent ...
- Web API使用记录系列(三)Web API与Owin
还好在坚持,今天继续更新第三篇随笔----使用owin来启动WebAPI(这里还是以IIS为宿主,当然也可以使用别的如Console.Windows Server等) 关于OWIN(Open Web ...
- 在ASP.NET Web API 2中使用Owin OAuth 刷新令牌(示例代码)
在上篇文章介绍了Web Api中使用令牌进行授权的后端实现方法,基于WebApi2和OWIN OAuth实现了获取access token,使用token访问需授权的资源信息.本文将介绍在Web Ap ...
- 在ASP.NET Web API 2中使用Owin基于Token令牌的身份验证
基于令牌的身份验证 基于令牌的身份验证主要区别于以前常用的常用的基于cookie的身份验证,基于cookie的身份验证在B/S架构中使用比较多,但是在Web Api中因其特殊性,基于cookie的身份 ...
- Web API与OAuth:既生access token,何生refresh token
在前一篇博文中,我们基于 ASP.NET Web API 与 OWIN OAuth 以 Resource Owner Password Credentials Grant 的授权方式( grant_t ...
随机推荐
- List<T>保存为XML文件
今天我们学习怎样把List<T>写成一个XML文件保存起来.因为我们在做动态网站开发时,需要对一些不太常变化的数据产生为XML文件,让程序直接去读取,而不是每次是SQL数据库取. 为了解决 ...
- Web API配置自定义路由
默认访问Web API时,是无需指定method名.它会按照默认的路由来访问.如果你的Web API中出现有方法重载时,也许得配置自定义路由: 标记1为自定义路由,标记2为默认路由,需要把自定义路由排 ...
- 基于MVC4+EasyUI的Web开发框架经验总结(15)--在MVC项目中使用RDLC报表
RDLC是一个不错的报表,有着比较不错的设计模式和展现效果,在我的Winform开发里面,使用RDLC也是一个比较方便操作,如可以参考文章<DevExpress的XtraReport和微软RDL ...
- android布局属性详解
RelativeLayout用到的一些重要的属性: 第一类:属性值为true或false android:layout_centerHrizontal 水平居中 android:layout_cen ...
- dev中控件属性设置
private void Form1_Load(object sender, EventArgs e) { ///构建数据源 DataTable table = new DataTable(); // ...
- Android的px、dp和sp
Android的px.dp和sppx: 即像素,1px代表屏幕上一个物理的像素点:偶尔用到px的情况,是需要画1像素表格线或阴影线的时候. dp: 这个是最常用但也最难理解的尺寸单位.它与“像素密度” ...
- Oracle 数据库基础学习 (二) 学习小例子:创建一个表,记录商品买卖的情况
运行环境:Oracle database 11g + PL/SQL Developer ex: --创建一个表 create table plspl_test_product( --加入not n ...
- Win10环境下安装theano并配置GPU详细教程
一.软件和环境 (1)安装日期2016/12/23: (2)原材料VS2013,cuda-8.0(最好下载cuda7.5,目前theano-0.8.2对cuda-8支持不是很好),Anaconda3- ...
- 为什么正常安装并成功运行了Genymotion虚拟但是运行的时候启动的却是自带的模拟器?
最近因为这个问题困惑了好久,最终找到了解决思路: 点击genymotion——setting——ADB——Use sustom Android tools,找到电脑中SDK文件位置就可了! 希望自己坚 ...
- 习题: codevs 2492 上帝造题的七分钟2 解题报告
这道题是受到大犇MagHSK的启发我才得以想出来的,蒟蒻觉得自己的代码跟MagHSK大犇的代码完全比不上,所以这里蒟蒻就套用了MagHSK大犇的代码(大家可以关注下我的博客,友情链接就是大犇MagHS ...