[ASP.NET] 结合Web API在OWIN下实现OAuth

OAuth(Open Authorization)

为用户资源的授权提供了一个安全的、开放而又简易的标准。与以往的授权方式不同之处是OAuth的授权不会使第三方触及到用户的帐号信息(如用户名与密码),即第三方无需使用用户的用户名与密码就可以申请获得该用户资源的授权,因此OAuth是安全的。

本节目录:

  • Owin下WebAPI SelfHost
  • 创建AccessToken
  • 使用AccessToken

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://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

时间: 2024-08-05 03:54:33

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

Web API在OWIN下实现OAuth

Web API在OWIN下实现OAuth OAuth(Open Authorization) 为用户资源的授权提供了一个安全的.开放而又简易的标准.与以往的授权方式不同之处是OAuth的授权不会使第三方触及到用户的帐号信息(如用户名与密码),即第三方无需使用用户的用户名与密码就可以申请获得该用户资源的授权,因此OAuth是安全的. 本节目录: Owin下WebAPI SelfHost 创建AccessToken 使用AccessToken Owin下WebAPI SelfHost 1.创建一个控

在Mac下创建ASP.NET Core Web API

在Mac下创建ASP.NET Core Web API 在Mac下创建ASP.NET Core Web API 这系列文章是参考了.NET Core文档和源码,可能有人要问,直接看官方的英文文档不就可以了吗,为什么还要写这些文章呢? 原因如下: 官方文档涉及的内容相当全面,属于那种大而全的知识仓库,不太适合初学者,很容易让人失去重要,让人掉入到具体的细节之中. 对于大多数人来讲开发语言只是工具,程序员都有一个通病,就是死磕工具,把工具学深.我认为在工具上没有必要投入太多时间,以能高效地完成日常的

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

Docker容器环境下ASP.NET Core Web API应用程序的调试 本文主要介绍通过Visual Studio 2015 Tools for Docker – Preview插件,在Docker容器环境下,对ASP.NET Core Web API应用程序进行调试.在自己做实验的过程中也碰到了一些问题,经过一些测试和搜索资料,基本解决了这些问题,本文也会对这些问题进行介绍,以免有相同需求的朋友多走弯路. 插件的下载与安装 至撰写本文为止,Visual Studio 2015 Tools

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

很长一段时间以来,我都在思考如何在ASP.NET Core的框架下,实现一套完整的事件驱动型架构.这个问题看上去有点大,其实主要目标是为了实现一个基于ASP.NET Core的微服务,它能够非常简单地订阅来自于某个渠道的事件消息,并对接收到的消息进行处理,于此同时,它还能够向该渠道发送事件消息,以便订阅该事件消息的消费者能够对消息数据做进一步处理.让我们回顾一下微服务之间通信的几种方式,分为同步和异步两种.同步通信最常见的就是RESTful API,而且非常简单轻量,一个Request/Resp

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

在上文中,我介绍了事件驱动型架构的一种简单的实现,并演示了一个完整的事件派发.订阅和处理的流程.这种实现太简单了,百十行代码就展示了一个基本工作原理.然而,要将这样的解决方案运用到实际生产环境,还有很长的路要走.今天,我们就研究一下在事件处理器中,对象生命周期的管理问题. 事实上,不仅仅是在事件处理器中,我们需要关心对象的生命周期,在整个ASP.NET Core Web API的应用程序里,我们需要理解并仔细推敲被注册到IoC容器中的服务,它们的生命周期应该是个怎样的情形,这也是服务端应用程序设

ASP.NET MVC Web API 学习笔记---Web API概述及程序示例

1. Web API简单说明 近来很多大型的平台都公开了Web API.比如百度地图 Web API,做过地图相关的人都熟悉.公开服务这种方式可以使它易于与各种各样的设备和客户端平台集成功能,以及通过在浏览器中使用 JavaScript来创建更丰富的HTML体验.所以我相信Web API会越来越有它的用武之地. 说道Web API很多人都会想到Web服务,但是他们仍然有一定的区别:Web API服务是通过一般的 HTTP公开了,而不是通过更正式的服务合同 (如SOAP) 2. ASP.NET W

ASP.NET MVC Web API 学习笔记---第一个Web API程序

http://www.cnblogs.com/qingyuan/archive/2012/10/12/2720824.html 1. Web API简单说明 近来很多大型的平台都公开了Web API.比如百度地图 Web API,做过地图相关的人都熟悉.公开服务这种方式可以使它易于与各种各样的设备和客户端平台集成功能,以及通过在浏览器中使用 JavaScript来创建更丰富的HTML体验.所以我相信Web API会越来越有它的用武之地. 说道Web API很多人都会想到Web服务,但是他们仍然有

【转载】ASP.NET MVC Web API 学习笔记---第一个Web API程序

1. Web API简单说明 近来很多大型的平台都公开了Web API.比如百度地图 Web API,做过地图相关的人都熟悉.公开服务这种方式可以使它易于与各种各样的设备和客户端平台集成功能,以及通过在浏览器中使用 JavaScript来创建更丰富的HTML体验.所以我相信Web API会越来越有它的用武之地. 说道Web API很多人都会想到Web服务,但是他们仍然有一定的区别:Web API服务是通过一般的 HTTP公开了,而不是通过更正式的服务合同 (如SOAP)  2. ASP.NET

asp.net mvc+web api+easyui

前奏:第一次写博客,记录一下学习和开发的过程. 现在写的是一个后台管理系统,有基本的权限功能,其他功能都可以扩展.用到的技术是 asp.net mvc5,web api 2,entityframework,autofac,easyui等. 先来上个解决方案的图:  01-ZY.Web.MVC:是页面的展示,由于用了web api 所以在mvc里面没有做数据的操作.mvc里面主要有权限的判断,controller里面也没有太多的逻辑处理. 02-ZY.Web.Api:这里用到了web api.we