【转】在ASP.NET Web API 2中使用Owin基于Token令牌的身份验证

基于令牌的身份验证

基于令牌的身份验证主要区别于以前常用的基于cookie的身份验证,基于cookie的身份验证在B/S架构中使用比较多,但是在Web Api中因其特殊性,基于cookie的身份验证已经不适合了,因为并不是每一个调用api的客户端都是从浏览器发起,我们面临的客户端可能是手机、平板、或者app。

使用基于Token令牌的身份验证有一些好处:

  • 服务器的可伸缩性:发送到服务器的令牌是自包含的,不依赖于共享会话存储
  • 松散耦合:前端应用程序位于特定的身份验证机制耦合,令牌是从服务器生成的,并且API构建方式可理解该令牌并进行身份验证
  • 适用于移动设备:cookie依赖于浏览器,存储于本机平台,使用token将简化流程

构建后端API

步骤一: 创建Web Api 项目

 

为了进行代码演示,创建一个相对比较干净的环境,我们新建一个项目,演示本次功能,本文使用Visual Studio 2017和 .NTE Framework 4.7。

在Vs中选择新建项目,选择ASP.NET Web 应用程序(.NET Framework) ,命名为OauthExample或者随便你喜欢的名字,然后下一步,选择空模板。ok

image

 

步骤二:安装Owin包,并设置“StartUp”类

项目右键,管理Nuget程序包,分别安装

Microsoft.AspNet.WebApi.Owin

Microsoft.Owin.Host.SystemWeb

也可以在程序包管理器输入如下代码安装:

Install-Package Microsoft.AspNet.WebApi.Owin 
Install-Package Microsoft.Owin.Host.SystemWeb

等待安装完成。

右键项目,移除Global.asax,右键项目,添加OWIN StartUp 类,然后修改代码如下:

 

using System.Web.Http;
using Microsoft.Owin;
using Owin;[assembly: OwinStartup(typeof(OAuthExample.Startup))]namespace OAuthExample
{public class Startup{public void Configuration(IAppBuilder app){// 有关如何配置应用程序的详细信息,请访问 https://go.microsoft.com/fwlink/?LinkID=316888HttpConfiguration config = new HttpConfiguration();WebApiConfig.Register(config);app.UseWebApi(config);}}
}

 

简要说明

  • assembly属性设置了启动时要触发的类
  • HttpConfiguration对象用于配置API路由等,我们将对象传递给Register方法
  • UasWebApi接收对象config,该方法将把Web Api连接到我们的OWIN服务管道

完成后编译一下,检查是否能通过,如果有问题检查一下Nuget包是否安装正确。

 

步骤三:添加对OAuth承载令牌生成的支持

安装Owin包,Microsoft.Owin.Security.OAuth,再次打开StartUp文件,修改代码如下(斜体):

复制代码

using System;
using System.Web.Http;
using Microsoft.Owin;
using Microsoft.Owin.Security.OAuth;
using Owin;[assembly: OwinStartup(typeof(OAuthExample.Startup))]namespace OAuthExample
{public class Startup{public void Configuration(IAppBuilder app){// 有关如何配置应用程序的详细信息,请访问 https://go.microsoft.com/fwlink/?LinkID=316888OAuthAuthorizationServerOptions OAuthServerOptions = new OAuthAuthorizationServerOptions(){AllowInsecureHttp = true,TokenEndpointPath = new PathString("/oauth/token"),AccessTokenExpireTimeSpan = TimeSpan.FromDays(1),Provider = new CustomAuthorizationServerProvider()};// Token Generationapp.UseOAuthAuthorizationServer(OAuthServerOptions);app.UseOAuthBearerAuthentication(new OAuthBearerAuthenticationOptions());HttpConfiguration config = new HttpConfiguration();WebApiConfig.Register(config);app.UseWebApi(config);}}
}

复制代码

在这里,我们从类“OAuthAuthorizationServerOptions”创建了新实例,并设置选项如下:

  • 允许客户端使用http协议请求
  • 令牌生成路径为"/oauth/token" ,即通过路径host: port:/oauth/token 获取令牌信息
  • 设置令牌的有效时间为一天,如果用户在令牌发出24小时候使用令牌进行身份验证,请求将被拒绝,并返回401状态码
  • 我们在名为“CustomAuthorizationServerProvider”的类中实现了如何用户票据的验证和发放

最后我们将此选项传递给扩展方法“ UseOAuthAuthorizationServer”,以便将身份验证中间件添加到管道中。

 

步骤四:实现“CustomAuthorizationServerProvider”类

在项目中添加名为“ Providers”的新文件夹,然后添加名为“ SimpleAuthorizationServerProvider”的新类,在下面粘贴代码片段:

复制代码

using System.Security.Claims;
using System.Threading.Tasks;
using Microsoft.Owin.Security.OAuth;namespace OAuthExample.Providers
{public class CustomAuthorizationServerProvider : OAuthAuthorizationServerProvider{/// <summary>/// Called to validate that the origin of the request is a registered "client_id", and that the correct credentials for that client are/// present on the request. If the web application accepts Basic authentication credentials,/// context.TryGetBasicCredentials(out clientId, out clientSecret) may be called to acquire those values if present in the request header. If the web/// application accepts "client_id" and "client_secret" as form encoded POST parameters,/// context.TryGetFormCredentials(out clientId, out clientSecret) may be called to acquire those values if present in the request body./// If context.Validated is not called the request will not proceed further./// </summary>/// <param name="context">The context of the event carries information in and results out.</param>public override async Task ValidateClientAuthentication(OAuthValidateClientAuthenticationContext context){context.Validated();}/// <summary>/// Called when a request to the Token endpoint arrives with a "grant_type" of "password". This occurs when the user has provided name and password/// credentials directly into the client application's user interface, and the client application is using those to acquire an "access_token" and/// optional "refresh_token". If the web application supports the/// resource owner credentials grant type it must validate the context.Username and context.Password as appropriate. To issue an/// access token the context.Validated must be called with a new ticket containing the claims about the resource owner which should be associated/// with the access token. The application should take appropriate measures to ensure that the endpoint isn’t abused by malicious callers./// The default behavior is to reject this grant type./// See also http://tools.ietf.org/html/rfc6749#section-4.3.2/// </summary>/// <param name="context">The context of the event carries information in and results out.</param>public override async Task GrantResourceOwnerCredentials(OAuthGrantResourceOwnerCredentialsContext context){context.OwinContext.Response.Headers.Add("Access-Control-Allow-Origin", new[] { "*" });//这里是验证用户名和密码,可以根据项目情况自己实现if (!(context.UserName == "zhangsan" && context.Password == "123456")){context.SetError("invalid_grant", "The user name or password is incorrect.");return;}//可以随便添加var identity = new ClaimsIdentity(context.Options.AuthenticationType);identity.AddClaim(new Claim("sub", context.UserName));identity.AddClaim(new Claim("role", "user"));context.Validated(identity);}}
}

复制代码

步骤五:允许ASP.NET Web Api跨域请求

使用nuget安装程序包,Install-Package Microsoft.Owin.Cors

然后在Startup类中添加如下代码,最终代码如下:

复制代码

using System;
using System.Web.Http;
using Microsoft.Owin;
using Microsoft.Owin.Security.OAuth;
using OAuthExample.Providers;
using Owin;[assembly: OwinStartup(typeof(OAuthExample.Startup))]namespace OAuthExample
{public class Startup{public void Configuration(IAppBuilder app){// 有关如何配置应用程序的详细信息,请访问 https://go.microsoft.com/fwlink/?LinkID=316888OAuthAuthorizationServerOptions OAuthServerOptions = new OAuthAuthorizationServerOptions(){AllowInsecureHttp = true,TokenEndpointPath = new PathString("/token"),AccessTokenExpireTimeSpan = TimeSpan.FromDays(1),Provider = new CustomAuthorizationServerProvider()};// Token Generationapp.UseOAuthAuthorizationServer(OAuthServerOptions);app.UseOAuthBearerAuthentication(new OAuthBearerAuthenticationOptions());HttpConfiguration config = new HttpConfiguration();WebApiConfig.Register(config);app.UseCors(Microsoft.Owin.Cors.CorsOptions.AllowAll);app.UseWebApi(config);}}
}

复制代码

代码测试

我们添加一个测试空的Order控制,用来测试一下上面的实现:

复制代码

[RoutePrefix("api/Orders")]public class OrdersController : ApiController{[Authorize][Route("")]public IHttpActionResult Get(){return Ok(Order.CreateOrders());}}#region Helperspublic class Order{public int OrderID { get; set; }public string CustomerName { get; set; }public string ShipperCity { get; set; }public Boolean IsShipped { get; set; }public static List<Order> CreateOrders(){List<Order> OrderList = new List<Order> {new Order {OrderID = 10248, CustomerName = "Taiseer Joudeh", ShipperCity = "Amman", IsShipped = true },new Order {OrderID = 10249, CustomerName = "Ahmad Hasan", ShipperCity = "Dubai", IsShipped = false},new Order {OrderID = 10250,CustomerName = "Tamer Yaser", ShipperCity = "Jeddah", IsShipped = false },new Order {OrderID = 10251,CustomerName = "Lina Majed", ShipperCity = "Abu Dhabi", IsShipped = false},new Order {OrderID = 10252,CustomerName = "Yasmeen Rami", ShipperCity = "Kuwait", IsShipped = true}};return OrderList;}}#endregion

复制代码

 

下面使用PostMan进行模拟测试.

在未授权时,直接访问 http://localhost:56638/api/orders得到如下结果:

image

模拟授权访问,先获取令牌:

image

 

将令牌附加到Order请求,再次尝试访问:

 

image

可以看到已经能正常获取到数据,打开调试,看一下方法中的变量如下:

image

 

总结

一直觉得WebApi和MVC很多都一样的东西,在实际应用中还是有不少区别,关于OAuth、JWT等等在WebApi中使用较多,本文是参照文末连接做的一个总结,细看下原po的时间都已经是14年的文章了。马上要aspnet core 3.2都要发布了,现在却还在补以前的知识,惭愧的很!

 

参考链接:

 Token Based Authentication using ASP.NET Web API 2, Owin, and Identity

Enable OAuth Refresh Tokens in AngularJS App using ASP .NET Web API 2, and Owin

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/436490.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

number 限制最长数字_Java源码阅读-Number

抽象类Number是BigDecimal, BigInteger,Byte,Double,Float,Integer, Long, Short类的父类&#xff0c;实现了java.io.Serializable接口&#xff0c;这个接口以后再说。其中的抽象方法主要是基本数据类型的转换&#xff0c;这些方法都可能涉及到四舍五入和截断Integer类实现了父…

(JavaScript)实现在客户端动态改变Treeview节点的选中状态

Asp.net 2.0 中的 Treeview 非常好用&#xff0c;而且轻便。但在使用过程中&#xff0c;往往会发现一些不够人性化的地方。例如您要设计一棵树&#xff0c;里面放置了一些收藏的网址。在这棵树中&#xff0c;节点的 SelectAction 只有 Expand 和 NavigateUrl 状态&#xff0c;也…

【转】Castle中AdditionalInterfaces用法介绍

首先见下图&#xff08;图一&#xff09;&#xff0c;其中FooController是一个没有实现任何Interface的空类。需要实现的效果是&#xff1a;通过FooController对象调用FooService的Do方法。设置这一不常见的场景主要是为了说明Castle中AdditionalInterfaces的用法。 这个场景诡…

ffmpeg添加到环境变量_Windows + MSVC环境编译ffmpeg

实测成功环境: WIN7 VS2013 FFmpeg4.3 和 WIN10 VS2019 FFmpeg4.3(N-98819-ge2589ac)源码下载FFmpeg源码依赖工具MSYS2​YASM下载安装MSYS2&#xff1b; 下载YASM,将文件名改为yasm.exe,将它所在的目录加入到环境变量中。配置头文件和库搜索路径以下几种方法任选一种1.使用…

【转】阿里技术专家详解 DDD 系列 第一讲- Domain Primitive

导读 对于一个架构师来说&#xff0c;在软件开发中如何降低系统复杂度是一个永恒的挑战&#xff0c;无论是 94 年 GoF 的 Design Patterns &#xff0c; 99 年的 Martin Fowler 的 Refactoring &#xff0c; 02 年的 P of EAA &#xff0c;还是 03 年的 Enterprise Integratio…

wince编译报错

新建了工程&#xff0c;加入之前完整的BSP&#xff0c;怎么也编译不过&#xff0c;提示&#xff1a; [01:0000009403:ERRORE] NMAKE : U1073: dont know how to make C:\WINCE600\OSDesigns\xyjhht30\xyjhht30\Wince600\SMDK6410_ARMV4I\cesysgen\sdk\lib\ARMV4I\retail\ddraw.…

服务器怎么把信息发送给用户,java中怎么用tcp/ip将服务器的消息发送给多个用户...

java中怎么用tcp/ip将服务器的消息发送给多个用户关注:253 答案:2 mip版解决时间 2021-01-31 01:26提问者╬═掵中注定2021-01-30 20:03java中怎么用tcp/ip将服务器的消息发送给多个用户最佳答案二级知识专家往事叫我剪短发2021-01-30 20:09你服务器accept方法后是不是会得到…

VS2005 .vs. Orcas

这两天正在开发自己的一套信息管理系统&#xff0c;开发环境采用 VS2005 C# XP。由于习惯用Dreamweaver 布局&#xff0c;这可好&#xff0c;在DW中布局完成之后&#xff0c;在VS中就完全走形了。郁闷!刚好龙卷风版 Vista 有了&#xff0c;那就装一个试试IIS7和 Orcas。Good&…

解析NK.BIN

最近做NBOOT&#xff0c;EBOOT&#xff0c;对TOC参数不是很明白&#xff0c;老大说得先熟悉一下NK.bin。故找到以下好文&#xff0c;对NK.bin有了一个深入的了解。感谢作者。 study NK.bin format The information from WINCE500\PRIVATE\WINCEOS\COREOS\NK\TOOLS\ROMIMAGE\VI…

查询链接服务器信息,SQL Server链接服务器

SQL Server提供链接到另一个服务器的选项。这通常被用来连接到其他SQL Server数据库&#xff0c;但它也可以被用来连接到一个Microsoft Access数据库。这是通过链接服务器节点成为可能。链接服务器节点可以连接到另一个数据库&#xff0c;通常/通常在不同的机器上运行&#xff…

【转】阿里技术专家详解DDD系列 第二讲 - 应用架构

填坑。谢谢大家对这个系列的期待&#xff0c;持续更新&#xff0c;欢迎关注此账号。 第一篇内容附地址&#xff1a; 阿里巴巴淘系技术&#xff1a;阿里技术专家详解 DDD 系列 第一讲- Domain Primitive​zhuanlan.zhihu.com 架构这个词源于英文里的“Architecture“&#xff…

【转】应用架构之道:分离业务逻辑和技术细节

架构 什么是架构&#xff1f; 关于架构这个概念很难给出一个明确的定义&#xff0c;也没有一个标准的定义。 硬是要给一个概述&#xff0c;我认为架构就是对系统中的实体以及实体之间的关系所进行的抽象描述。 架构始于建筑&#xff0c;是因为人类发展&#xff08;原始人自…

ARM9之NAND FLASH总结

/*author----->Armking*/ /*data----->2008年9月2*/ /*ps:本人总结&#xff0c;备于日后查阅&#xff0c;如若转载&#xff0c;请注明出处*/ /*QQ:382750150*/ 写于篇头&#xff1a; 终于又开始接着学习了&#xff0c;只是不知道为什么JTAG又连不上目标板了&#xff0c;如…

【转】SD-WAN,到底是什么*****

作为一个热门概念&#xff0c;SD-WAN近年以来频繁地出现在我们的视野当中。 很多人说&#xff0c;它是未来最具发展潜力的通信技术之一&#xff0c;极具商业价值。 行业里的老牌通信设备商和运营商对它一致看好&#xff0c;新兴创业企业也把它视为千载难逢的风口机遇&#xff0…

ffmpeg 截图太模糊了_PPT图片模糊?导师说放大!

今日分享图片智能放大●●●●重庆大学PPT图片太模糊了&#xff0c;要用原图&#xff01;放大&#xff0c;放大导师如是说&#xff0c;小硕表示&#xff0c;图片本就这样这咋办&#xff1f;不愁&#xff0c;稳住接着看在做PPT时还是做论文时想用某张图片&#xff0c;但是直接拉…

【转】全了!临港四镇最新对口地段小学,中学都在这里,看看你的孩子能读哪个学校

临港的家长们关于自己的孩子就读哪个学校&#xff0c;家长们一直都很关心和关注&#xff0c;每个家长对孩子的教育很是重视&#xff0c;有部分家长买临港的房子就冲着学区去的&#xff0c;临港的优质教育资源一直是被居民所称赞的&#xff0c;学校也没家长失望&#xff0c;个别…

【转】Azure Az-900认证 04——-考取AZ900所有知识点总结--获取证书!

结合最近所做的模拟题&#xff0c;把一些容易考的知识和概念重新回顾记录一下。标红的字要注意一下&#xff0c;有可能这几个简单的字&#xff0c;就是最能概括这个概念的关键点&#xff0c;个人在回顾的时候把这些点红色标出来了&#xff0c;会在题干中以不同的案例形式来考察…

怎么用vc采集ni卡数据_8bit,200MS/s 低成本模拟输入高速采集卡FCFR-PCI9850

FCFR-PCI98508bit,200MS/s 低成本模拟输入高速采集卡FCFR-PCI9850&#xff08;简称PCI9850&#xff09;是低成本高速数字化化仪&#xff0c;AD分辨率8bit&#xff0c;AD采样率200MS/s&#xff0c;硬件FIFO缓存32M字节&#xff0c;采集卡支持50MS/s的高速连续采集&#xff0c;触…

S3C6410启动模式介绍

目前的ARM处理器都支持多种启动模式&#xff0c;S3C6410和以前的Samsung的ARM处理器一样&#xff0c;通过外部管脚OM[4:0]的拉高拉低来决定是从哪个存储设备上启动。我认为S3C6410的User Manual并没有说的很清楚&#xff0c;所以我在最开始使用的时候&#xff0c;也对其启动模式…

如何用木板做桥_如何辨别使用的公园椅是否需要保养

如何辨别使用的公园椅存在哪些问题新城市公园椅小编与您分享&#xff0c;每一项事物都会有它的使用寿命&#xff0c;公园椅也不例外。公园椅使用有几年后后&#xff0c;我们通过公园椅的哪些表现来发现公园椅存在哪些隐患呢&#xff1f;通过观察、触摸、按压这三种方式来发现公…