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类

        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控制器

    public class ValuesController : ApiController
{
public string Get()
{
return "Never、C";
}
}

4.Main方法启动

        static void Main(string[] args)
{
const string url = "http://localhost:1234/";
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添加一个中间件配置

    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

            config.Filters.Add(new HostAuthenticationFilter(OAuthDefaults.AuthenticationType)); //添加的配置
app.UseWebApi(config);

  

2.自定义的provider

    public class OTWAuthorizationServerProvider : OAuthAuthorizationServerProvider
{
//1.验证客户
public override Task ValidateClientAuthentication(OAuthValidateClientAuthenticationContext context)
{
       //此处可以判断client和user 
//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.用客户端来调用我们的(建议不要用单元测试,此处新建一个控制台项目)

        static void Main(string[] args)
{
const string url = "http://localhost:1234/";
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

    [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

    class Program
{
static void Main(string[] args)
{
const string url = "http://localhost:1234/";
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

http://www.cnblogs.com/xizz/p/5038923.html

[ASP.NET] 结合Web API在OWIN下实现OAuth的更多相关文章

  1. Web API在OWIN下实现OAuth

    OAuth(Open Authorization) 为用户资源的授权提供了一个安全的.开放而又简易的标准.与以往的授权方式不同之处是OAuth的授权不会使第三方触及到用户的帐号信息(如用户名与密码), ...

  2. Docker容器环境下ASP.NET Core Web API应用程序的调试

    本文主要介绍通过Visual Studio 2015 Tools for Docker – Preview插件,在Docker容器环境下,对ASP.NET Core Web API应用程序进行调试.在 ...

  3. 在Mac下创建ASP.NET Core Web API

    在Mac下创建ASP.NET Core Web API 这系列文章是参考了.NET Core文档和源码,可能有人要问,直接看官方的英文文档不就可以了吗,为什么还要写这些文章呢? 原因如下: 官方文档涉 ...

  4. Docker容器环境下ASP.NET Core Web API

    Docker容器环境下ASP.NET Core Web API应用程序的调试 本文主要介绍通过Visual Studio 2015 Tools for Docker – Preview插件,在Dock ...

  5. ASP.NET Core Web API下事件驱动型架构的实现(一):一个简单的实现

    很长一段时间以来,我都在思考如何在ASP.NET Core的框架下,实现一套完整的事件驱动型架构.这个问题看上去有点大,其实主要目标是为了实现一个基于ASP.NET Core的微服务,它能够非常简单地 ...

  6. ASP.NET Core Web API下事件驱动型架构的实现(二):事件处理器中对象生命周期的管理

    在上文中,我介绍了事件驱动型架构的一种简单的实现,并演示了一个完整的事件派发.订阅和处理的流程.这种实现太简单了,百十行代码就展示了一个基本工作原理.然而,要将这样的解决方案运用到实际生产环境,还有很 ...

  7. ASP.NET Core Web API下事件驱动型架构的实现(三):基于RabbitMQ的事件总线

    在上文中,我们讨论了事件处理器中对象生命周期的问题,在进入新的讨论之前,首先让我们总结一下,我们已经实现了哪些内容.下面的类图描述了我们已经实现的组件及其之间的关系,貌似系统已经变得越来越复杂了. 其 ...

  8. C#实现多级子目录Zip压缩解压实例 NET4.6下的UTC时间转换 [译]ASP.NET Core Web API 中使用Oracle数据库和Dapper看这篇就够了 asp.Net Core免费开源分布式异常日志收集框架Exceptionless安装配置以及简单使用图文教程 asp.net core异步进行新增操作并且需要判断某些字段是否重复的三种解决方案 .NET Core开发日志

    C#实现多级子目录Zip压缩解压实例 参考 https://blog.csdn.net/lki_suidongdong/article/details/20942977 重点: 实现多级子目录的压缩, ...

  9. 重温.NET下Assembly的加载过程 ASP.NET Core Web API下事件驱动型架构的实现(三):基于RabbitMQ的事件总线

    重温.NET下Assembly的加载过程   最近在工作中牵涉到了.NET下的一个古老的问题:Assembly的加载过程.虽然网上有很多文章介绍这部分内容,很多文章也是很久以前就已经出现了,但阅读之后 ...

随机推荐

  1. 【Cocos2d-x】VS2012开发2dx无法解析的外部符号解决记录(第一篇)【转】

    come from http://acoder.me/cocos2d-unresolved-external-symbol.html 看到cocos2d-x带了扩展包,心动的想尝试下,以下分享下我使用 ...

  2. YAFFS2文件系统分析(转)

    http://blog.chinaunix.net/uid-25314474-id-343665.html 1.前言略. 2.yaffs 文件系统简介按理说这里应该出现一些诸如“yaffs 是一种适合 ...

  3. 多线程socket编程示例

    工程: 代码: package com.my.socket.business; /** * 业务实现类 * * @author ZY * */ public class CoreMisBusiness ...

  4. EntityFramework 5.0 CodeFirst 教程04-查询,插入,更新,和删除数据

    ---------------------目录-------------------------- EntityFramework 5.0 CodeFirst 教程04-查询,插入,更新,和删除数据  ...

  5. Android学习笔记----TimerTask中显示Toast的问题

    今天想在TimerTask的run函数中调用Toast显示一下提示信息,却总是导致程序崩溃.可是try语句块却又无法捕获到异常,代码如下: ...... Timer timer = new Timer ...

  6. Two classes have the same XML type name 排错【转】

    今天遇到一个问题,webservice发布的时候报下面的错误: <strong>Caused by: com.sun.xml.bind.v2.runtime.IllegalAnnotati ...

  7. Intellij idea 乱码问题(英文操作系统)

    英文操作系统导致 Debug 下的变量查看时显示乱码,可通过改变字体解决此问题.

  8. struts2:JSP页面及Action中获取HTTP参数(parameter)的几种方式

    本文演示了JSP中获取HTTP参数的几种方式,还有action中获取HTTP参数的几种方式. 1. 创建JSP页面(testParam.jsp) <%@ page language=" ...

  9. 用Unity模仿CSGO里的火焰效果

    CSGO里的火焰效果和真实的情况比较像,能沿着遮挡物前进,如下是模仿效果. 思路比较简单,开始想的是一圈一圈发出去,但是前圈与后圈的联系不好做,换种思路,每个方向发射一条线,这样根据上一个位置的方位先 ...

  10. JavaWeb(李兴华著)开发笔记

    1.Java语法-基础 环境变量-JAVA_HOME, PATH, ClassPath 变量名 作用 举例 JAVA_HOME 指向JDK目录 C:\Program Files\Java\jdk1.7 ...