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

网站建设珠海办公室装修设计 公司

网站建设珠海,办公室装修设计 公司,wordpress主题安装说明,房管局第 10 章 应用和微服务安全云应用意味着应用运行所在的基础设施无法掌控#xff0c;因此安全不能再等到事后再考虑#xff0c;也不能只是检查清单上毫无意义的复选框由于安全与云原生应用密切相关#xff0c;本章将讨论安全话题#xff0c;并用示例演示几种保障 ASP.NET Co… 第 10 章 应用和微服务安全云应用意味着应用运行所在的基础设施无法掌控因此安全不能再等到事后再考虑也不能只是检查清单上毫无意义的复选框由于安全与云原生应用密切相关本章将讨论安全话题并用示例演示几种保障 ASP.NET Core Web 应用和微服务安全的方法云环境中的安全内网应用企业一直在开发这种支持性的应用但当我们需要基于运行在可缩放的云基础设施之的 PaaS 开发此类应用时很多旧的模式和实践将很快失效一个最明显的问题就是无法支持 Windows 身份验证长期以来ASP.NET 开发人员一直沉浸在借助内置的 Windows 凭据来保障 Web 应用安全的便利中不管是公有云平台还是私有部署的 PaaS 平台在这些平台上支撑应用的操作系统应被视为临时存续的有些企业的安全策略要求所有虚拟机在滚动更新期间需要销毁并重新构建从而缩小持续攻击的可能范围Cookie 和 Forms 身份验证当应用运行于 PaaS 环境中时Cookie 身份验证仍然适用不过它也会给应用增加额外负担首先Forms 身份验证要求应用对凭据进行维护并验证也就是说应用需要处理好这些保密信息的安全保障、加密和存储云环境中的应用内加密在传统 ASP.NET 应用开发中常见的加密使用场景是创建安全的身份验证 Cookie 和会话 Cookie在这种加密机制中Cookie 加密时会用到机器密钥然后当 Cookie 由浏览器发回 Web 应用时再使用同样的机器密钥对其进行解密如果无法依赖持久化文件系统又不可能在每次启动应用时将密钥置于内存中这些密钥将如何存储答案是将加密密钥的存储和维护视为后端服务也就是说与状态维持机制、文件系统、数据库和其他微服务一样这个服务位于应用之外Bearer 令牌本章的示例将讲解 OAuth 和 OpenID Connect 简称 OIDC如果要以 HTTP 友好、可移植的方式传输身份证明最常见的方法就是 Bearer 令牌应用从 Authorization 请求头接收 Dearer 令牌下例展示一个包含 Bearer 令牌的 HTTP 跟踪会话POST /api/service HTTP/1.1 Host: world-domination.io Authorization: Bearer ABC123HIJABC123HIJABC123HIJ Content-Type: application/x-www-form-urlencoded User-Agent: Mozilla/5.0 (XLL; Linux x86_64) etc...etc...etc...Authorization 请求头的值中包含一个表示授权类型的单词紧接着是包含凭据的字符序列通常服务在处理 Bearer 令牌时会从 Authorization 请求头提取令牌很多各式的令牌例如 OAuth 2.0 JWT通常将 Base64 编码用作一种 URL 友好格式因此验证令牌的第一步就是解码以获取原有内容如果令牌使用私钥加密服务就需要使用公钥验证令牌确实由正确的发行方颁发ASP.NET Core Web 应用安全本章示例中我们将主要关注 OpenID Connetc 和 JWT 格式的 Bearer 令牌OpenID Connect 基础OpenID Connect 是 OAuth2 的一个超集它规定了身份提供方IDP、用户和应用之间的安全通信的规范和标准使用 OIDC 保障 ASP.NET Core 应用的安全作为本章第一个代码清单我们将使用 OIDC 为一个简单的 ASP.NET CoreMVC Web 应用提供安全保障功能创建一个空的 Web 应用$ dotnet new mvc使用 Auth0 账号配置身份提供方服务现在可转到 http://auth0.com/注册完成后进入面板点击“创建客户端”按钮请确保应用类型选择为“常规 Web 应用”选择 ASP.NET Core 作为实现语言后将转到一个 “快速开始”教程其代码与本章将要编写的内容非常相似使用 OIDC 中间件GitHub链接https://github.com/microservices-aspnetcore/secure-servicesusing System; using System.Collections.Generic; using System.Linq; using System.Security.Claims; using System.Threading.Tasks; using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Hosting; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; using Microsoft.AspNetCore.Authentication.Cookies; using Microsoft.AspNetCore.Authentication.OpenIdConnect; using Microsoft.AspNetCore.Http;namespace StatlerWaldorfCorp.SecureWebApp {public class Startup{public Startup(IHostingEnvironment env){var builder new ConfigurationBuilder().SetBasePath(env.ContentRootPath).AddJsonFile(appsettings.json, optional: false, reloadOnChange: false).AddEnvironmentVariables();Configuration builder.Build();}public IConfigurationRoot Configuration { get; }// This method gets called by the runtime. Use this method to add services to the container.public void ConfigureServices(IServiceCollection services){services.AddAuthentication(options options.SignInScheme CookieAuthenticationDefaults.AuthenticationScheme);// Add framework services.services.AddMvc();services.AddOptions();services.ConfigureOpenIDSettings(Configuration.GetSection(OpenID));}// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.public void Configure(IApplicationBuilder app, IHostingEnvironment env,ILoggerFactory loggerFactory,IOptionsOpenIDSettings openIdSettings){Console.WriteLine(Using OpenID Auth domain of : openIdSettings.Value.Domain);loggerFactory.AddConsole(Configuration.GetSection(Logging));loggerFactory.AddDebug();if (env.IsDevelopment()){app.UseDeveloperExceptionPage();}else{app.UseExceptionHandler(/Home/Error);}app.UseStaticFiles();app.UseCookieAuthentication( new CookieAuthenticationOptions{AutomaticAuthenticate true,AutomaticChallenge true});var options CreateOpenIdConnectOptions(openIdSettings);options.Scope.Clear();options.Scope.Add(openid);options.Scope.Add(name);options.Scope.Add(email);options.Scope.Add(picture);app.UseOpenIdConnectAuthentication(options);app.UseMvc(routes {routes.MapRoute(name: default,template: {controllerHome}/{actionIndex}/{id?});});}private OpenIdConnectOptions CreateOpenIdConnectOptions(IOptionsOpenIDSettings openIdSettings){return new OpenIdConnectOptions(Auth0){Authority $https://{openIdSettings.Value.Domain},ClientId openIdSettings.Value.ClientId,ClientSecret openIdSettings.Value.ClientSecret,AutomaticAuthenticate false,AutomaticChallenge false,ResponseType code,CallbackPath new PathString(/signin-auth0),ClaimsIssuer Auth0,SaveTokens true,Events CreateOpenIdConnectEvents()};}private OpenIdConnectEvents CreateOpenIdConnectEvents(){return new OpenIdConnectEvents(){OnTicketReceived context {var identity context.Principal.Identity as ClaimsIdentity;if (identity ! null) {if (!context.Principal.HasClaim( c c.Type ClaimTypes.Name) identity.HasClaim( c c.Type name))identity.AddClaim(new Claim(ClaimTypes.Name, identity.FindFirst(name).Value));}return Task.FromResult(0);}};}} }与之前各章代码的第一点区别在于我们创建了一个名为 OpenIdSettings 的选项类从配置系统读入后以 DI 的服务方式提供给应用它是一个简单类其属性仅用于存储每种 OIDC 客户端都会用到的四种元信息授权域名客户端 ID客户端密钥回调 URL由于这些信息的敏感性我们的 appsettings.json 文件没有签入到 GitHub不过以下代码清单列出了它的大致格式{OpenID: {Domain: Your Auth0 domain,ClientId: Your Auth0 Client Id,ClientSecret: Your Auth0 Client Secret,CallbackUrl: http://localhost:5000/signin-auth0} }接下来要在 Startup 类中执行的两部操作是让 ASP.NET Core 使用 Cookie 身份验证和 OpenID Connect 身份验证添加一个 account 控制器提供的功能包括登录、注销、以及使用一个视图显示用户身份中的所有特征using Microsoft.AspNetCore.Authentication.Cookies; using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Http.Authentication; using Microsoft.AspNetCore.Authorization; using System.Linq; using System.Security.Claims;namespace StatlerWaldorfCorp.SecureWebApp.Controllers {public class AccountController : Controller{public IActionResult Login(string returnUrl /){return new ChallengeResult(Auth0, new AuthenticationProperties() { RedirectUri returnUrl });}[Authorize]public IActionResult Logout(){HttpContext.Authentication.SignOutAsync(Auth0);HttpContext.Authentication.SignOutAsync(CookieAuthenticationDefaults.AuthenticationScheme);return RedirectToAction(Index, Home);}[Authorize]public IActionResult Claims(){ViewData[Title] Claims;var identity HttpContext.User.Identity as ClaimsIdentity;ViewData[picture] identity.FindFirst(picture).Value;return View();}} }Claims 视图代码它从特征集合中逐个取出特征的类型和值并呈现在表格中同时视图还显示用户头像div classrowdiv classcol-md-12h3Current User Claims/h3br/ img srcViewData[picture] height64 width64/br/table classtabletheadtrthClaim/ththValue/th/tr/theadtbodyforeach (var claim in User.Claims){trtdclaim.Type/tdtdclaim.Value/td/tr}/tbody/table/div /div现在我们已经基于一个模板生成的空白 ASP.NET Core Web 应用建立了与第三方云友好的身份提供服务的连接这让云应用能够利用 Bearer 令牌和 OIDC 标准的优势从手工管理身份验证的负担中解放出来OIDC 中间件和云原生我们已经讨论过在使用 Netflix OSS 技术栈时如何借助 Steeltoe 类库支持应用配置和服务发现我们可以使用来自 Steeltoe 的 NuGet 模块 Steeltoe.Security.DataProtection.Redis它专门用于将数据保护 API 所用的存储从本地磁盘迁移到外部的 Redis 分布式缓存中在这个类库可使用以下方式在 Startup 类的 ConfigureServices 方法中配置由外部存储支持的数据保护功能services.AddMvc();services.AddRedisConnectionMultiplexer(Configuration); services.AddDataProtection().PersisitKeysToRedis().SetApplicationName(myapp-redis-keystore);services.AddDistributedRedisCache(Configuration);services.AddSession();接着我们在 Configure 方法中调用 app.UseSession() 以完成外部会话状态的配置保障 ASP.NET Core 微服务的安全本节我们讨论为微服务提供安全保障的几种方法并通过开发一个使用 Bearer 令牌提供安全功能的微服务演示其中的一种方法使用完整 OIDC 安全流程保障服务的安全在这个流程中用户登录的流程前面已经讨论过即通过几次浏览器重定向完成网站和 IDP 之间的交互当网站获取到合法身份后会向 IDP 申请访问令牌申请时需要提供身份证令牌以及正在被请求的资源的信息使用客户端凭证保障服务的安全首先只允许通过 SSL 与服务通信此外消费服务的代码需要在调用服务时附加凭据这种凭据通常就是用户名和密码在一些不存在人工交互的场景中将其称为客户端标识和客户端密钥更准确使用 Bearer 令牌保障服务的安全在服务的 Startup 类型的 Configure 方法中启用并配置 JWT Bearer 身份验证app.UseJwtBearerAuthentication(new JwtBearerOptions) {AutomaticAuthenticate true,AutomaticChallenge true,TokenValidationParameters new TokenValidationParameters{ValidateIssuerSigningKey true,IssuerSigningKey signingKey,ValidateIssuer false,ValidIssuer http://fake.issuer.com,ValidateAudience false,ValidAudience http://sampleservice.example.com,ValidateLifetime true,} };我们可控制在接收 Bearer 令牌期间要执行的各种验证包括颁发方签名证书、颁发方名称、接收名称以及令牌的时效在上面的代码中我们禁用了颁发方和接收方名称验证其过程都是相当简单的字符串对比检查开启验证时颁发方和接收方名称必须与令牌中包含的颁发方式和接收方式名称严格匹配要创建一个密钥用于令牌签名时所用的密钥进行对比我们需要一个保密密钥并从它创建一个 SymmetricSecurityKeystring SecretKey sericouslyneverleavethissitting in yourcode; SymmetricSecurityKey signingKey new SymmetricSecurityKey(Encoding.ASCII.GetBytes(SecretKey));为了消费安全的服务我们需要创建一个简单的控制台应用它从一组 Claim 对象生成一个 JwtSecurityToken 实例并作为 Bearer 令牌放入 Authorization 请求头发给服务端var claims new [] {new Claim(JwtRegisteredClaimNames.Sub, AppUser_Bob),new Claim(JwtRegisteredClaimNames.Jti, Guid.NewGuid().ToString()),new Claim(JwtRegisteredClaimNames.Iat, ToUnixEpochDate(DataTime.Now).ToString(), ClaimValueTypes.Integer64), }; var jwt new JwtSecurityToken(issuer : issuer,audience : audience,claims : claims,notBefore : DateTiem.UtcNow,expires : DateTime.UtcNow.Add(TimeSpan.FromMinutes(20)),signingCredentials: creds) httpClient.DefaultRequestHeaders.Authorization new AuthenticationHeaderValue(Bearer, encodedJwt);var result httpClient.GetAsync(http://localhost:5000/api/secured).Result; Console.WriteLine(result.StatusCode); Console.WriteLine(result.Content.ToString());下面是一个受安全机制保护的控制器方法它将枚举从客户端发来的身份特征[Authorize] [HttpGet] public string Get() {foreach (var claim in HttpContext.User.Claims){Console.WriteLine(${claim.Type}:{claim.Value});}return this is from the super secret area; }如果要控制特定客户端能够访问的控制器方法我们可以利用策略概念策略是在授权检查过程中执行一小段代码[Authorize( Policy CheeseburgerPolicy)] [HttpGet(policy)] public string GetWithPolicy() {return this is from the super secret area w/policy enforcement.; }在 ConfigureServices 方法中配置策略的过程很简单public void ConfigureServices(IServiceCollection services){services.AddMvc();services.AddOptions();services.AddAuthorization( options {options.AddPolicy(CheeseburgePolicy,policy policy.RequireClaim(icanhazcheeseburger, true));}); }现在只要修改控制台应用在其中添加这种类型的特征并将值指定为 true就既能调用普通受保护的控制器方法又能调用标记了 CheeseburgerPolicy 策略的方法该策略需要特定的身份特征、用户名、条件以及角色还可以通过实现 IAuthorizationRequirement 接口定义定制的需求这样就可以添加自定义验证逻辑而不会影响各个控制器
http://www.huolong8.cn/news/144264/

相关文章:

  • 做网站要什么步骤效果好的锦州网站建设
  • 广东省城乡建设厅投诉网站首页上海工商网一窗通
  • 虚拟电脑可以做网站吗j建设网站需要的工具
  • 郑州诺耀科技 - 郑州高端网站建设营销推广网站落地页制作
  • 那里可以做PC28网站的外国网站后台设计
  • 在线教育网站怎么做婚庆网站建设策划案
  • 报告怎么写范文大全seo排名怎样
  • 社区教育网站开发seo关键词怎么选
  • 上海网站建设公司介绍大连工业大学研究生
  • 哪个旅游网站做的最好网站开发用什么框架合适
  • 站长素材WordPress怎么找主题
  • 上海自适应网站设计做网站卖大闸蟹
  • 免费推广网站视频兰州网站建设q.479185700強
  • 网站建设600元包建设银行招聘网站
  • 做的网站老被攻击奉化市住房和城乡建设局网站
  • 如果网站不备案wordpress的目录结构(一)
  • 中国十大品牌网站wordpress的分类目录
  • 建一个网站多少钱?wordpress 收邮件发布
  • 中交建设集团 网站不想使用wordpress
  • 上线倒计时单页网站模板汕头网站推广公司
  • 包头外贸网站建设烟台建设局网站
  • 网站作为医院形象建设apache 建立网站
  • 普陀微信网站建设无锡知名网站制作
  • 济南做网站怎么做视频直播网站
  • 教育培训排行榜前十名绍兴seo淄博公司
  • 网站tag页面如何做福田附近公司做网站建设多少钱
  • 网站建设定制公司莱芜吧 百度贴吧
  • 生物科技网站建设 中企动力北京wordpress 随机一句话
  • 用手机做服务器做网站装修公司加盟好还是自己开
  • 网站开发常用的谷歌插件阿克苏建设局网站