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

手机建立一个免费网站网页设计师培训方法

手机建立一个免费网站,网页设计师培训方法,wordpress 本机安装目录,全国建设建管中心网站使用请求头认证来测试需要授权的 API 接口Intro有一些需要认证授权的接口在写测试用例的时候一般会先获取一个 token#xff0c;然后再去调用接口#xff0c;其实这样做的话很不灵活#xff0c;一方面是存在着一定的安全性问题#xff0c;获取 token 可能会有一些用户名密码… 使用请求头认证来测试需要授权的 API 接口Intro有一些需要认证授权的接口在写测试用例的时候一般会先获取一个 token然后再去调用接口其实这样做的话很不灵活一方面是存在着一定的安全性问题获取 token 可能会有一些用户名密码之类的测试数据还有就是获取 token 的话如果全局使用同一个 token 会很不灵活如果我要测试没有用户信息的话还比较简单我可以不传递 token如果token里有两个角色我要测试另外一个角色的时候只能给这个测试用户新增一个角色然后再获取token这样就很不灵活于是我就尝试把之前写的自定义请求头认证的代码整理了一下集成到了一个 nuget 包里以方便其他项目使用nuget 包是 WeihanLi.Web.Extensions源代码在这里 https://github.com/WeihanLi/WeihanLi.Web.Extensions 有想自己改的可以直接拿去用目前提供了基于请求头的认证和基于 QueryString 的认证两种认证方式。实现效果基于请求头动态配置用户的信息需要什么样的信息就在请求头中添加什么信息示例如下再来看个单元测试的示例[Fact] public async Task MakeReservationWithUserInfo() {using var request new HttpRequestMessage(HttpMethod.Post, /api/reservations);request.Headers.TryAddWithoutValidation(UserId, GuidIdGenerator.Instance.NewId()); // 用户Idrequest.Headers.TryAddWithoutValidation(UserName, Environment.UserName); // 用户名request.Headers.TryAddWithoutValidation(UserRoles, User,ReservationManager); //用户角色request.Content new StringContent(${{reservationUnit:nnnnn,reservationActivityContent:13211112222,reservationPersonName:谢谢谢,reservationPersonPhone:13211112222,reservationPlaceId:f9833d13-a57f-4bc0-9197-232113667ece,reservationPlaceName:第一多功能厅,reservationForDate:2020-06-13,reservationForTime:10:00~12:00,reservationForTimeIds:1}}, Encoding.UTF8, application/json);using var response await Client.SendAsync(request);Assert.Equal(HttpStatusCode.OK, response.StatusCode); } 实现原理解析实现原理其实挺简单的就是实现了一种基于 header 的自定义认证模式从 header 中获取用户信息并进行认证核心代码如下protected override async TaskAuthenticateResult HandleAuthenticateAsync() {if (await Options.AuthenticationValidator(Context)){var claims new ListClaim();if (Request.Headers.TryGetValue(Options.UserIdHeaderName, out var userIdValues)){claims.Add(new Claim(ClaimTypes.NameIdentifier, userIdValues.ToString()));}if (Request.Headers.TryGetValue(Options.UserNameHeaderName, out var userNameValues)){claims.Add(new Claim(ClaimTypes.Name, userNameValues.ToString()));}if (Request.Headers.TryGetValue(Options.UserRolesHeaderName, out var userRolesValues)){var userRoles userRolesValues.ToString().Split(new[] { Options.Delimiter }, StringSplitOptions.RemoveEmptyEntries);claims.AddRange(userRoles.Select(r new Claim(ClaimTypes.Role, r)));}if (Options.AdditionalHeaderToClaims.Count 0){foreach (var headerToClaim in Options.AdditionalHeaderToClaims){if (Request.Headers.TryGetValue(headerToClaim.Key, out var headerValues)){foreach (var val in headerValues.ToString().Split(new[] { Options.Delimiter }, StringSplitOptions.RemoveEmptyEntries)){claims.Add(new Claim(headerToClaim.Value, val));}}}}// claims identity s authentication type can not be null https://stackoverflow.com/questions/45261732/user-identity-isauthenticated-always-false-in-net-core-custom-authenticationvar principal new ClaimsPrincipal(new ClaimsIdentity(claims, Scheme.Name));var ticket new AuthenticationTicket(principal,Scheme.Name);return AuthenticateResult.Success(ticket);}return AuthenticateResult.NoResult(); } 其实就是将请求头的信息读取到 Claims然后返回一个 ClaimsPrincipal 和 AuthenticationTicket在读取 header 之前有一个 AuthenticationValidator 是用来验证请求是不是满足使用 Header 认证是一个基于 HttpContext 的断言委托(FuncHttpContext, Taskbool)默认实现是验证是否有 UserId 对应的 Header如果要修改可以通过 Startup 来配置使用示例Startup 配置和其它的认证方式一样Header 认证和 Query 认证也提供了基于 AuthenticationBuilder 的扩展只需要在 services.AddAuthentication() 后增加 Header 认证的模式即可示例如下services.AddAuthentication(HeaderAuthenticationDefaults.AuthenticationSchema).AddQuery(options {options.UserIdQueryKey uid;}).AddHeader(options {options.UserIdHeaderName X-UserId;options.UserNameHeaderName X-UserName;options.UserRolesHeaderName X-UserRoles;}); 默认的 Header 是 UserId/UserName/UserRoles你也可以自定义为符合自己需要的配置如果只是想新增一个转换可以配置 AdditionalHeaderToClaims 增加自己需要的请求头 Claims 转换AuthenticationValidator 也可以自定义就是上面提到的会首先会验证是不是需要读取 Header验证通过之后才会读取 Header 信息并认证测试示例有一个接口我需要登录之后才能访问需要用户信息类似下面这样[HttpPost] [Authorize] public async TaskIActionResult MakeReservation([FromBody] ReservationViewModel model) {// ... } 在测试代码里我配置使用了 Header 认证在请求的时候直接通过 Header 来控制用户的信息Startup 配置services.AddAuthentication(HeaderAuthenticationDefaults.AuthenticationSchema).AddHeader()// 使用 Query 认证//.AddAuthentication(QueryAuthenticationDefaults.AuthenticationSchema)//.AddQuery(); 测试代码[Fact] public async Task MakeReservationWithUserInfo() {using var request new HttpRequestMessage(HttpMethod.Post, /api/reservations);request.Headers.TryAddWithoutValidation(UserId, GuidIdGenerator.Instance.NewId());request.Headers.TryAddWithoutValidation(UserName, Environment.UserName);request.Headers.TryAddWithoutValidation(UserRoles, User,ReservationManager);request.Content new StringContent(${{reservationUnit:nnnnn,reservationActivityContent:13211112222,reservationPersonName:谢谢谢,reservationPersonPhone:13211112222,reservationPlaceId:f9833d13-a57f-4bc0-9197-232113667ece,reservationPlaceName:第一多功能厅,reservationForDate:2020-06-13,reservationForTime:10:00~12:00,reservationForTimeIds:1}}, Encoding.UTF8, application/json);using var response await Client.SendAsync(request);Assert.Equal(HttpStatusCode.OK, response.StatusCode); }[Fact] public async Task MakeReservationWithInvalidUserInfo() {using var request new HttpRequestMessage(HttpMethod.Post, /api/reservations);request.Headers.TryAddWithoutValidation(UserName, Environment.UserName);request.Content new StringContent(${{reservationUnit:nnnnn,reservationActivityContent:13211112222,reservationPersonName:谢谢谢,reservationPersonPhone:13211112222,reservationPlaceId:f9833d13-a57f-4bc0-9197-232113667ece,reservationPlaceName:第一多功能厅,reservationForDate:2020-06-13,reservationForTime:10:00~12:00,reservationForTimeIds:1}}, Encoding.UTF8, application/json);using var response await Client.SendAsync(request);Assert.Equal(HttpStatusCode.Unauthorized, response.StatusCode); }[Fact] public async Task MakeReservationWithoutUserInfo() {using var request new HttpRequestMessage(HttpMethod.Post, /api/reservations){Content new StringContent({reservationUnit:nnnnn,reservationActivityContent:13211112222,reservationPersonName:谢谢谢,reservationPersonPhone:13211112222,reservationPlaceId:f9833d13-a57f-4bc0-9197-232113667ece,reservationPlaceName:第一多功能厅,reservationForDate:2020-06-13,reservationForTime:10:00~12:00,reservationForTimeIds:1},Encoding.UTF8, application/json)};using var response await Client.SendAsync(request);Assert.Equal(HttpStatusCode.Unauthorized, response.StatusCode); } MoreQueryString 认证和请求头认证是类似的这里就不再赘述只是把请求头上的参数转移到 QueryString 上了觉得不够好用的可以直接 Github 上找源码修改, 也欢迎 PR源码地址https://github.com/WeihanLi/WeihanLi.Web.ExtensionsReferencehttps://github.com/WeihanLi/WeihanLi.Web.Extensionshttps://www.nuget.org/packages/WeihanLi.Web.Extensionshttps://github.com/OpenReservation/ReservationServer/blob/dev/ActivityReservation.API.Test/TestStartup.cshttps://github.com/OpenReservation/ReservationServer/blob/dev/ActivityReservation.API.Test/Controllers/ReservationControllerTest.cshttps://www.cnblogs.com/weihanli/p/cutom-authentication-in-aspnetcore.html
http://www.pierceye.com/news/638069/

相关文章:

  • 广告在线制作图片外贸推广建站蓝颜seo牛
  • 成都网站创建wordpress 未找到
  • 网站seo链接购买长宁广州网站建设
  • 网站分类导航代码wordpress笔记主题
  • 网站常用代码阿里云 全国网站建设
  • 盗取dede系统做的网站模板深圳建设工程信息网站
  • 百度SEO网站江门网站建设公司哪家好
  • 成都网站建设 四川冠辰科技php响应式网站
  • 大连网站建设辽icp备阿里云 网站
  • 网站开发前期准备做网站渠道
  • 网站根目录是哪里没有面板的服务器怎么建设网站
  • 济南市住房城乡建设网无锡优化网站公司
  • 公司网站设计好河南比较出名的外贸公司
  • 清除网站黑链湖州市住房和城乡建设局官方网站
  • 凡科网的网站建设好用吗网站开发过程的数据交互
  • 郑州做商城网站公司开发微信小程序流程
  • 宝安电子厂做网站外包app开发多少钱
  • 箱包 东莞网站建设公司网站建设与设计制作
  • 网站如何做点击链接地址直播平台排行榜前十名
  • 万网域名指向网站wordpress 下载媒体库
  • 小店网站制作php做的网站首页是什么文件
  • i深建官方网站淮南网络营销哪家强
  • 网上网站怎么做织梦网站模块
  • 怎么新建自己的网站百度广告推广费用
  • 北京 科技网站建设上海短视频推广公司
  • 帮别人做网站哪里可以接单大型网站开发团队的美工需要什么工作经验和教育背景及薪酬
  • 网站开发工程师社交哔哩哔哩网页版入口2023在线观看
  • 凡客 网站设计wordpress也没
  • 深圳的网站建设公司排名电话外呼系统呼叫中心系统
  • 2022没封的网站免费的闵行区网站建设