当前位置: 首页 > news >正文

烟台小学网站建设做家电网站好

烟台小学网站建设,做家电网站好,百度seo代做,现在还有网站做校内网吗原文出自Rui Figueiredo的博客#xff0c;原文链接《Secure a Web Api in ASP.NET Core》摘要#xff1a;这篇文章阐述了如何使用 Json Web Token (Jwt)方式 来配置身份验证中间件。这种方式十分适合移动App 后端等不使用cookie的后端程序。网络上有许多资源可以教你如何保护… 原文出自Rui Figueiredo的博客原文链接《Secure a Web Api in ASP.NET Core》摘要这篇文章阐述了如何使用 Json Web Token (Jwt)方式 来配置身份验证中间件。这种方式十分适合移动App 后端等不使用cookie的后端程序。网络上有许多资源可以教你如何保护ASP.NET Core Web应用程序。我写过一些例如 ASP.NET Core Identity From Scratch , External Login Providers in ASP.NET Core and Facebook Authentiation with ASP.NET Core.不过对于保护Asp.Net WebApi网络上有用的信息似乎不多。所以在这篇博文中我将介绍如何使用Json Web TokensJWT来保护ASP.NET Core中的Web Api。我在github中有一个演示项目你可以照着它来做。使用token替代cookie在一个Web应用程序中如果你不打算使用供应外部调用例如一个移动应用程序的API那么它通常使用一个cookie来表示一个已经登录的用户。一般的流程是用户单击登录进入登录页面输入有效凭证后服务器发送给用户浏览器的响应包含一个带有加密信息的 Set-Cookie 头。cookie会被设置上domain 例如 blinkingcaret.com,每次浏览器向这个domain发送请求时设置在这个domain上的cookie也会被带上。在服务器上cookie将被解密然后使用解密后的内容来创建用户的 Identity。如果客户端是一个浏览器这种方式将会非常非常适合。不过当我们的客户端是一个移动应用程序时候那就另当别论了。JWT我们可以使用什么来代替cookie呢没错就是token。token也代表用户但是当我们使用它的时候我们不再依赖于浏览器的内置机制以及用它和cookie打交道。我们必须明确地向服务器要一个token我们自己将它存储在某个地方然后在每个请求发送时手动带上它。有一些方法可以使这个尽可能简单快捷我会在后面讨论其中的一些方法。我将在这里讨论的token格式是JWT。JWT代表Json Web Token。JWTtoken具有以下格式 base64-encoded-header.base64-encoded-payload.signature 。一个heder的例子是{“alg”: “HS265”,“typ”: “JWT” }payload包含一系列 claims例如{name: Rui,admin: true}最后通过采用“base64header.base64payload”创建签名并使用头部指定的算法对签名其进行加密。例如 HMAC-SHA256。签名部分会用到一个存储在server上的密钥这个密钥是不会发给客户端的。下面是一个真正的JWT的例子eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93cy8yMDA1LzA1L2lkZW50aXR5L2NsYWltcy9uYW1lIjoicnVpIiwic3ViIjoidGVzdCIsIm5iZiI6MTUwMzYxNDU4NSwiZXhwIjoxNTA2MDMzNzg1LCJpc3MiOiJibGlua2luZ2NhcmV0IHN0cyIsImF1ZCI6ImJsaW5raW5nY2FyZXQgYXBwIn0.F7PFoYcQXez3zV98BFKLpyON6d_1p-6IAeihZRSv0VM你必须注意的是JWT中包含的信息没有加密。为了获得有效payload你只需要base64解码。你甚至可以从你的开发者工具控制台例如在Chrome中这样做。使用atob方法并将payload作为参数传递。你会得到解密后的JSON 。signature只能保证如果有人篡改了payload那么signature将会失效。如果有人想成功替换有效载荷并生成有效的token他们需要知道签名中使用的密钥但是该密钥永远不会被发送到客户端。所以当你想往payload里放一些东西的时候你一定要知道上面这些译者注就是不要把敏感信息放在payload里比如密码。在 ASP.NET Core 中使用JWT要在ASP.NET Core中使用JWT我们需要知道如何手动创建JWTtoken如何验证它们以及如何创建端点以便客户端应用程序可以获得它们。如何创建JWTtoken首先你需要安装nuget包System.IdentityModel.Tokens.Jwt$ dotnet add package System.IdentityModel.Tokens.Jwt然后创建一个密钥。我们将使用 symmetric key译者注对称密钥代码如下var secretKey new SymmetricSecurityKey(Endoding.UTF8.GetBytes(a secret that needs to be at least 16 characters long));译者注a secret that needs to be at least 16 characters long一个至少需要16个字符的密码在验证签名时还会用到。我们的token将包含一组claims。所以让我们创建它们var claims new Claim[] {    new Claim(ClaimTypes.Name, John),     new Claims(JwtRegisteredClaimNames.Email, john.doeblinkingcaret.com) }我已经使用了两种claim类型 ClaimTypesSystem.Security.ClaimsJwtRegisteredClaimNamesSystem.IdentityModel.Tokens.Jwt要强调的是JwtRegisteredClaimNames包含在JWT RFC中列举的claims中。如果你打算使用不同编程语言或者框架生成的token那么为了兼容性你应该尽可能的使用这个。不过有一些声明类型可以在ASP.NET中启用某些功能。例如ClaimTypes.Name 是用户名User.Identity.Name的默认声明类型。另一个例子是ClaimTypes.Role如果你在Authorize属性中使用Roles属性例如[AuthorizeRoles “Administrator”]这个声明将会被检查用来确认权限。在创建我们想要在token中编码的claims列表之后我们可以创建token本身代码如下var token new JwtSecurityToken(      issuer: your app,      audience: the client of your app,      claims: claims,      notBefore: DateTime.Now,      expires: DateTime.Now.AddDays(28),      signingCredentials: new SigningCredentials(key, SecurityAlgorithms.HmacSha256) );这里有一些我之前没有提到的概念即发issueaudience和expiration dates。译者注 发行者受众/听众过期时间发行者表示生成token的实体在这个例子里它是ASP.NET Core Web应用程序。audience代表将要使用这些token的实体例如 client。如果你依靠第三方创建token不是现在所要用到的这个issue和audience是重要的。验证token时你可以验证issue和audience。notBefore 和 expire 定义了 token的有效时间区间在notBefore之后expire之前。最后在signedCredentials中指定使用哪个安全密钥和什么算法来创建签名。在这个例子中我们使用了HMAC-SHA256。如果你不关心issue和audience在JWT规范中是可选的你可以使用接受JwtSecurityHeader和JwtSecurityPayload的JwtSecurityToken的更简单的构造函数重载。不过你必须手动将expires和notBefore声明添加到有效内容中例如var claims new Claim[] {    new Claim(ClaimTypes.Name, John),    new Claims(JwtRegisteredClaimNames.Email, john.doeblinkingcaret.com),    new Claim(JwtRegisteredClaimNames.Exp, ${new DateTimeOffset(DateTime.Now.AddDays(1)).ToUnixTimeSeconds()}),    new Claim(JwtRegisteredClaimNames.Nbf, ${new DateTimeOffset(DateTime.Now).ToUnixTimeSeconds()})         }var token new JwtSecurityToken(new JwtHeader(new SigningCredentials(key, SecurityAlgorithms.HmacSha256)), new JwtPayload(claims));请注意Expexpires和NbfnotBefore声明的值是一个Unix时间的字符串。将DateTime转换为该格式的最简单方法是使用DateTimeOffset。在创建JwtSecurityToken的实例后实际生成token的方法是调用JwtSecurityTokenHandler实例的WriteToken方法并将JwtSecurityToken作为参数传递string jwtToken new JwtSecurityTokenHandler().WriteToken(token);创建获取token的端点现在我们知道如何创建我们的JWT token了我们还需要一种方法来让客户端获得它们。最简单的方法是创建一个期望发布请求的web api controller action 接受一个Post请求例如下面的代码public class TokenController : Controller{[Route(/token)][HttpPost]        public IActionResult Create(string username, string password)    {        if (IsValidUserAndPasswordCombination(username, password))                return new ObjectResult(GenerateToken(username));           return BadRequest();}//...在IsValidUserAndPasswordCombination中你可以来验证用户的凭据例如使用例如ASP.NET Identity如果你需要参考资料来学习ASP.NET Identity你可以看这篇博客 ASP.NET Identity Core From Scratch。GenerateToken我们刚刚在上一节中描述过。验证用户并使其登陆现在我们有了一种发行token的方法我们还需要一种方法来验证它们。我们将使用ASP.NET Core的身份验证中间件并将其配置为可接受JWT token。 将Microsoft.AspNetCore.Authentication.JwtBearer NuGet包添加到你的项目。$ dotnet add package Microsoft.AspNetCore.Authentication.JwtBearer接下来打开Startup.cs并更新ConfigureServices方法public void ConfigureServices(IServiceCollection services){    //...services.AddAuthentication(options {options.DefaultAuthenticateScheme JwtBearer;options.DefaultChallengeScheme JwtBearer;            }).AddJwtBearer(JwtBearer, jwtBearerOptions {                        jwtBearerOptions.TokenValidationParameters new TokenValidationParameters{                            ValidateIssuerSigningKey true,IssuerSigningKey new SymmetricSecurityKey(Encoding.UTF8.GetBytes(your secret goes here)),ValidateIssuer true,ValidIssuer The name of the issuer,ValidateAudience true,ValidAudience The name of the audience,ValidateLifetime true, //validate the expiration and not before values in the tokenClockSkew TimeSpan.FromMinutes(5) //5 minute tolerance for the expiration date};}); }如果你不熟悉ASP.NET Core的身份验证中间件则建议你阅读External Login Providers in ASP.NET Core。即使是关于如何使用GoogleFacebook等进行外部登陆提供程序登录但是这篇博客也含有有关身份验证中间件如何工作的详细说明。此外请注意这是新的ASP.NET Core 2.0语法其中通过ConfigureServices方法完全配置了身份验证但概念是相同的。译者注:External Login Providers in ASP.NET Core这篇博客在撰写的时候使用的是 Asp.Net Core 1.x。在这个例子中更重要的是 TokenValidationParameters 类。这是你必须实例化的类它将用来配置如何验证token。在Startup.cs中你需要更新Configure方法并添加身份验证中间件public void Configure(IApplicationBuilder app, IHostingEnvironment env){    //...app.UseAuthentication(); //needs to be up in the pipeline, before MVC//...app.UseMvc(ConfigureRoutes);//..Client 客户端web api客户端可以是桌面应用程序移动设备甚至是浏览器。我将要描述的例子是Web应用程序的登录、保存token、然后使用它来执行对请求的认证。你可以在这里找到一个可以正常工作的例子。首先为了能够登陆你需要将用户名和密码发送POST请求到“/ token”或者你设置的获取token的Web Api断点。你可以很容易地使用jQuery来做到这一点$.post(/token, $.param({username: the username, password: the password})).done(function(token){    //save the token in local storagelocalStorage.setItem(token, token);    //...}).fail(handleError);如果一切顺利则可以将获得JWT token然后你可以将其保存在某个位置通常在Web应用程序中我们将它保存到 local storage 中。在移动设备上则取决于你使用的平台但它们都具有允许你保存token的功能例如Android的SharedPreferences。对于上一节中的身份验证中间件接受JWT token并将其转换为可以在控制器操作中访问的User则该请求必须具有 Authorization header。header的值应该是“Bearer ”然后是JWT token例如Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93cy8yMDA1LzA1L2lkZW50aXR5L2NsYWltcy9uYW1l...尽管你可以“手动”将授权标头添加到每个请求但通常有自动执行的方法。例如jQuery中有一个时间可以允许你在发送请求之前做一些操作例如在这里检查是否存在 token如果有就加到Authentication头里。$.ajaxSetup({beforeSend: function(xhr) {          if (localStorage.getItem(token) ! null) {xhr.setRequestHeader(Authorization, Bearer localStorage.getItem(token));                      }} });  如果你使用其他框架也有类似的机制例如Angular有HttpInterceptors。最后你只需要从本地存储中删除token即可注销localStorage.removeItem(token)需要注意的一件事情是如果客户端执行的操作需要用户进行身份验证并且请求中没有有效授权标头则服务器将返回带有401状态码的响应。该响应还将具有WWW-Authenticate:Bearer header。如果你收到这样的响应则你可以通知用户需要验证身份。原文http://www.cnblogs.com/rocketRobin/p/8058760.html.NET社区新闻深度好文欢迎访问公众号文章汇总 http://www.csharpkit.com
http://www.huolong8.cn/news/216874/

相关文章:

  • 贵阳学网站建设廊坊建设局网站
  • 网站的建设和编程广州网络推广seo
  • 淄博网站制作高端网络做外贸网站价位
  • 互站网源码网站威海网站制作怎么样
  • 铁岭做网站信息seo推广宣传
  • 网站安全检测百度沈阳网站关键词优化排名
  • 国外做问卷调查的网站网站服务器暂时不可用怎么办
  • 福建住房城乡建设部网站耒阳网站开发
  • 建设网站申请书重庆荣昌网站建设公司
  • 正常做网站多少钱wordpress 留言表单
  • 视频网站怎样做wordpress投稿者权限
  • 个人电脑做网站服务器网站网站建设术语 英文
  • 怎么样自己创建网站泰州网站建设
  • 大连做网站制作个人网站开发技术
  • 泰兴网站建设价格网站营销管理培训班
  • 网站开发遇到的问题及解决方法古风自己做头像的网站
  • 那个网站做代买江苏省工程建设招标网站
  • 深圳网站制作工作室设计师案例网站
  • wp网站开发如何搭建手机网站源码
  • 怎么在百度上建网站自媒体视频剪辑培训班
  • 微信小程序网站模板在线法律咨询免费
  • 新八建设集团有限公司网站怎么建立淘宝客网站
  • 有哪些做废品的网站asp.net mvc网站发布教程
  • 网站建设whjzyh常宁城乡建设局网站查询
  • asp.net 网站开发视频教程巢湖网站开发
  • 网站建设费用兴田德润团队制作php网站
  • 做网站空间500m多少钱深圳市福田区
  • 徐州网站设计制作建设深圳网站建设商家
  • flash制作网站top建筑工程网上教育平台
  • 网站木马诊断网站建设有哪些环节