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

网站建设与管理维护不用编程做网站

网站建设与管理维护,不用编程做网站,建筑招工平台,自己做网站 需要会什么6上一篇文章再次把Swagger的使用进行了讲解#xff0c;完成了对Swagger的分组、描述和开启小绿锁以进行身份的认证授权#xff0c;那么本篇就来说说身份认证授权。开始之前先搞清楚几个概念#xff0c;请注意认证与授权是不同的意思#xff0c;简单理解#xff1a;认证完成了对Swagger的分组、描述和开启小绿锁以进行身份的认证授权那么本篇就来说说身份认证授权。开始之前先搞清楚几个概念请注意认证与授权是不同的意思简单理解认证是证明你的身份你有账号密码你可以登录进我们的系统说明你认证成功了授权即权限分配给用户某一权限标识用户得到什么什么权限才能使用系统的某一功能就是授权。身份认证可以有很多种方式可以创建一个用户表使用账号密码也可以接入第三方平台在这里我接入GitHub进行身份认证。当然你可以选择其他方式(如QQ、微信、微博等)可以自己扩展。打开GitHub进入开发者设置界面(https://github.com/settings/developers)我们新建一个 oAuth App。如图所示我们将要用到敏感数据放在appsettings.json中{...Github: {UserId: 13010050,ClientID: 5956811a5d04337ec2ca,ClientSecret: 8fc1062c39728a8c2a47ba445dd45165063edd92,RedirectUri: https://localhost:44388/account/auth,ApplicationName: 阿星Plus} } ClientID和ClientSecret是GitHub为我们生成的请注意保管好你的ClientID和ClientSecret。我这里直接给出了明文我将在本篇结束后删掉此 oAuth App ????。请自己创建噢RedirectUri是我们自己添加的回调地址。ApplicationName是我们应用的名称全部都要和GitHub对应。相应的在AppSettings.cs中读取.../// summary/// GitHub/// /summarypublic static class GitHub{public static int UserId Convert.ToInt32(_config[Github:UserId]);public static string Client_ID _config[Github:ClientID];public static string Client_Secret _config[Github:ClientSecret];public static string Redirect_Uri _config[Github:RedirectUri];public static string ApplicationName _config[Github:ApplicationName];} ... 接下来我们大家自行去GitHub的OAuth官方文档看看https://developer.github.com/apps/building-oauth-apps/authorizing-oauth-apps/分析一下我们接入GitHub身份认证授权整个流程下来分以下几步根据参数生成GitHub重定向的地址跳转到GitHub登录页进行登录登录成功之后会跳转到我们的回调地址回调地址会携带code参数拿到code参数就可以换取到access_token有了access_token可以调用GitHub获取用户信息的接口得到当前登录成功的用户信息开始之前先将GitHub的API简单处理一下。在.Domain层中Configurations文件夹下新建GitHubConfig.cs配置类将所需要的API以及appsettings.json的内容读取出来。//GitHubConfig.cs namespace Meowv.Blog.Domain.Configurations {public class GitHubConfig{/// summary/// GET请求跳转GitHub登录界面获取用户授权得到code/// /summarypublic static string API_Authorize https://github.com/login/oauth/authorize;/// summary/// POST请求根据code得到access_token/// /summarypublic static string API_AccessToken https://github.com/login/oauth/access_token;/// summary/// GET请求根据access_token得到用户信息/// /summarypublic static string API_User https://api.github.com/user;/// summary/// Github UserId/// /summarypublic static int UserId AppSettings.GitHub.UserId;/// summary/// Client ID/// /summarypublic static string Client_ID AppSettings.GitHub.Client_ID;/// summary/// Client Secret/// /summarypublic static string Client_Secret AppSettings.GitHub.Client_Secret;/// summary/// Authorization callback URL/// /summarypublic static string Redirect_Uri AppSettings.GitHub.Redirect_Uri;/// summary/// Application name/// /summarypublic static string ApplicationName AppSettings.GitHub.ApplicationName;} } 细心的同学可能以及看到了我们在配置的时候多了一个UserId。在这里使用一个策略因为我是博客系统管理员用户就只有我一个人GitHub的用户Id是唯一的我将自己的UserId配置进去当我们通过api获取到UserId和自己配置的UserId一致时就为其授权你就是我我认可你你可以进入后台随意玩耍了。在开始写接口之前还有一些工作要做就是在 .net core 中开启使用我们的身份认证和授权因为.HttpApi.Hosting层引用了项目.Application.Application层本身也需要添加Microsoft.AspNetCore.Authentication.JwtBearer所以在.Application添加包Microsoft.AspNetCore.Authentication.JwtBearer打开程序包管理器控制台用命令Install-Package Microsoft.AspNetCore.Authentication.JwtBearer安装这样就不需要重复添加引用了。在.HttpApi.Hosting模块类MeowvBlogHttpApiHostingModuleConfigureServices中添加public override void ConfigureServices(ServiceConfigurationContext context) {// 身份验证context.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme).AddJwtBearer(options {options.TokenValidationParameters new TokenValidationParameters{ValidateIssuer true,ValidateAudience true,ValidateLifetime true,ClockSkew TimeSpan.FromSeconds(30),ValidateIssuerSigningKey true,ValidAudience AppSettings.JWT.Domain,ValidIssuer AppSettings.JWT.Domain,IssuerSigningKey new SymmetricSecurityKey(AppSettings.JWT.SecurityKey.GetBytes())};});// 认证授权context.Services.AddAuthorization();// Http请求context.Services.AddHttpClient(); } 因为待会我们要在代码中调用GitHub的api所以这里提前将System.Net.Http.IHttpClientFactory和相关服务添加到IServiceCollection中。解释一下TokenValidationParameters参数的含义ValidateIssuer是否验证颁发者。ValidateAudience是否验证访问群体。ValidateLifetime是否验证生存期。ClockSkew验证Token的时间偏移量。ValidateIssuerSigningKey是否验证安全密钥。ValidAudience访问群体。ValidIssuer颁发者。IssuerSigningKey安全密钥。GetBytes()是abp的一个扩展方法可以直接使用。设置值全部为true时间偏移量为30秒然后将ValidAudience、ValidIssuer、IssuerSigningKey的值配置在appsettings.json中这些值都是可以自定义的不一定按照我填的来。//appsettings.json {...JWT: {Domain: https://localhost:44388,SecurityKey: H4sIAAAAAAAAA3N0cnZxdXP38PTy9vH18w8I9AkOCQ0Lj4iMAgDB4fXPGgAAAA,Expires: 30} }//AppSettings.cs ...public static class JWT{public static string Domain _config[JWT:Domain];public static string SecurityKey _config[JWT:SecurityKey];public static int Expires Convert.ToInt32(_config[JWT:Expires]);} ... Expires是我们的token过期时间这里也给个30。至于它是30分钟还是30秒由你自己决定。SecurityKey是我随便用编码工具进行生成的。同时在OnApplicationInitialization(...)中使用它。...public override void OnApplicationInitialization(ApplicationInitializationContext context){...// 身份验证app.UseAuthentication();// 认证授权app.UseAuthorization();...} ... 此时配置就完成了接下来去写接口生成Token并在Swagger中运用起来。在.Application层之前已经添加了包Microsoft.AspNetCore.Authentication.JwtBearer直接新建Authorize文件夹添加接口IAuthorizeService以及实现类AuthorizeService。//IAuthorizeService.cs using Meowv.Blog.ToolKits.Base; using System.Threading.Tasks;namespace Meowv.Blog.Application.Authorize {public interface IAuthorizeService{/// summary/// 获取登录地址(GitHub)/// /summary/// returns/returnsTaskServiceResultstring GetLoginAddressAsync();/// summary/// 获取AccessToken/// /summary/// param namecode/param/// returns/returnsTaskServiceResultstring GetAccessTokenAsync(string code);/// summary/// 登录成功生成Token/// /summary/// param nameaccess_token/param/// returns/returnsTaskServiceResultstring GenerateTokenAsync(string access_token);} } 添加三个接口成员方法全部为异步的方式同时注意我们是用之前编写的返回模型接收噢然后一一去实现他们。先实现GetLoginAddressAsync()咱们构建一个AuthorizeRequest对象用来填充生成GitHub登录地址在.ToolKits层新建GitHub文件夹引用.Domain项目添加类AuthorizeRequest.cs。//AuthorizeRequest.cs using Meowv.Blog.Domain.Configurations; using System;namespace Meowv.Blog.ToolKits.GitHub {public class AuthorizeRequest{/// summary/// Client ID/// /summarypublic string Client_ID GitHubConfig.Client_ID;/// summary/// Authorization callback URL/// /summarypublic string Redirect_Uri GitHubConfig.Redirect_Uri;/// summary/// State/// /summarypublic string State { get; set; } Guid.NewGuid().ToString(N);/// summary/// 该参数可选需要调用Github哪些信息可以填写多个以逗号分割比如scopeuser,public_repo。/// 如果不填写那么你的应用程序将只能读取Github公开的信息比如公开的用户信息公开的库(repository)信息以及gists信息/// /summarypublic string Scope { get; set; } user,public_repo;} }实现方法如下拼接参数输出GitHub重定向的地址。.../// summary/// 获取登录地址(GitHub)/// /summary/// returns/returnspublic async TaskServiceResultstring GetLoginAddressAsync(){var result new ServiceResultstring();var request new AuthorizeRequest();var address string.Concat(new string[]{GitHubConfig.API_Authorize,?client_id, request.Client_ID,scope, request.Scope,state, request.State,redirect_uri, request.Redirect_Uri});result.IsSuccess(address);return await Task.FromResult(result);} ... 同样的实现GetAccessTokenAsync(string code)构建AccessTokenRequest对象在.ToolKitsGitHub文件夹添加类AccessTokenRequest.cs。//AccessTokenRequest.cs using Meowv.Blog.Domain.Configurations;namespace Meowv.Blog.ToolKits.GitHub {public class AccessTokenRequest{/// summary/// Client ID/// /summarypublic string Client_ID GitHubConfig.Client_ID;/// summary/// Client Secret/// /summarypublic string Client_Secret GitHubConfig.Client_Secret;/// summary/// 调用API_Authorize获取到的Code值/// /summarypublic string Code { get; set; }/// summary/// Authorization callback URL/// /summarypublic string Redirect_Uri GitHubConfig.Redirect_Uri;/// summary/// State/// /summarypublic string State { get; set; }} } 根据登录成功得到的code来获取AccessToken因为涉及到HTTP请求在这之前我们需要在构造函数中依赖注入IHttpClientFactory使用IHttpClientFactory创建HttpClient。... private readonly IHttpClientFactory _httpClient;public AuthorizeService(IHttpClientFactory httpClient) {_httpClient httpClient; } ....../// summary/// 获取AccessToken/// /summary/// param namecode/param/// returns/returnspublic async TaskServiceResultstring GetAccessTokenAsync(string code){var result new ServiceResultstring();if (string.IsNullOrEmpty(code)){result.IsFailed(code为空);return result;}var request new AccessTokenRequest();var content new StringContent($code{code}client_id{request.Client_ID}redirect_uri{request.Redirect_Uri}client_secret{request.Client_Secret});content.Headers.ContentType new MediaTypeHeaderValue(application/x-www-form-urlencoded);using var client _httpClient.CreateClient();var httpResponse await client.PostAsync(GitHubConfig.API_AccessToken, content);var response await httpResponse.Content.ReadAsStringAsync();if (response.StartsWith(access_token))result.IsSuccess(response.Split()[1].Split().First());elseresult.IsFailed(code不正确);return result;} ... 使用IHttpClientFactory创建HttpClient可以自动释放对象用HttpClient发送一个POST请求如果GitHub服务器给我们返回了带access_token的字符串便表示成功了将其处理一下输出access_token。如果没有就代表参数code有误。在.HttpApi层新建一个AuthController控制器注入我们的IAuthorizeServiceService试试我们的接口。//AuthController.cs using Meowv.Blog.Application.Authorize; using Meowv.Blog.ToolKits.Base; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using System.Threading.Tasks; using Volo.Abp.AspNetCore.Mvc; using static Meowv.Blog.Domain.Shared.MeowvBlogConsts;namespace Meowv.Blog.HttpApi.Controllers {[ApiController][AllowAnonymous][Route([controller])][ApiExplorerSettings(GroupName Grouping.GroupName_v4)]public class AuthController : AbpController{private readonly IAuthorizeService _authorizeService;public AuthController(IAuthorizeService authorizeService){_authorizeService authorizeService;}/// summary/// 获取登录地址(GitHub)/// /summary/// returns/returns[HttpGet][Route(url)]public async TaskServiceResultstring GetLoginAddressAsync(){return await _authorizeService.GetLoginAddressAsync();}/// summary/// 获取AccessToken/// /summary/// param namecode/param/// returns/returns[HttpGet][Route(access_token)]public async TaskServiceResultstring GetAccessTokenAsync(string code){return await _authorizeService.GetAccessTokenAsync(code);}} } 注意这里我们添加了两个Attribute[AllowAnonymous]、[ApiExplorerSettings(GroupName Grouping.GroupName_v4)]在.Swagger层中为AuthController添加描述信息... new OpenApiTag {Name Auth,Description JWT模式认证授权,ExternalDocs new OpenApiExternalDocs { Description JSON Web Token } } ... 打开Swagger文档调用一下我们两个接口看看效果。然后打开我们生成的重定向地址会跳转到登录页面如下点击Authorize按钮登录成功后会跳转至我们配置的回调页面.../account/auth?code10b7a58c7ba2e4414a14statea1ef05212c3b4a2cb2bbd87846dd4a8e然后拿到code(10b7a58c7ba2e4414a14)在去调用一下获取AccessToken接口成功返回我们的access_token(97eeafd5ca01b3719f74fc928440c89d59f2eeag)。拿到access_token就可以去调用获取用户信息API了。在这之前我们先来写几个扩展方法待会和以后都用得着在.ToolKits层新建文件夹Extensions添加几个比较常用的扩展类(...)。扩展类的代码我就不贴出来了。大家可以去GitHub(https://github.com/Meowv/Blog/tree/blog_tutorial/src/Meowv.Blog.ToolKits/Extensions)自行下载每个扩展方法都有具体的注释。接下来实现GenerateTokenAsync(string access_token)生成Token。有了access_token可以直接调用获取用户信息的接口https://api.github.com/user?access_token97eeafd5ca01b3719f74fc928440c89d59f2eeag 会得到一个json将这个json包装成一个模型类UserResponse.cs。在这里教大家一个小技巧如果你需要将json或者xml转换成模型类可以使用Visual Studio的一个快捷功能点击左上角菜单编辑 选择性粘贴 将JSON粘贴为类/将XML粘贴为类是不是很方便快去试试吧。//UserResponse.cs namespace Meowv.Blog.ToolKits.GitHub {public class UserResponse{public string Login { get; set; }public int Id { get; set; }public string Avatar_url { get; set; }public string Html_url { get; set; }public string Repos_url { get; set; }public string Name { get; set; }public string Company { get; set; }public string Blog { get; set; }public string Location { get; set; }public string Email { get; set; }public string Bio { get; set; }public int Public_repos { get; set; }} } 然后看一下具体生成token的方法吧。.../// summary/// 登录成功生成Token/// /summary/// param nameaccess_token/param/// returns/returnspublic async TaskServiceResultstring GenerateTokenAsync(string access_token){var result new ServiceResultstring();if (string.IsNullOrEmpty(access_token)){result.IsFailed(access_token为空);return result;}var url ${GitHubConfig.API_User}?access_token{access_token};using var client _httpClient.CreateClient();client.DefaultRequestHeaders.Add(User-Agent, Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.14 Safari/537.36 Edg/83.0.478.13);var httpResponse await client.GetAsync(url);if (httpResponse.StatusCode ! HttpStatusCode.OK){result.IsFailed(access_token不正确);return result;}var content await httpResponse.Content.ReadAsStringAsync();var user content.FromJsonUserResponse();if (user.IsNull()){result.IsFailed(未获取到用户数据);return result;}if (user.Id ! GitHubConfig.UserId){result.IsFailed(当前账号未授权);return result;}var claims new[] {new Claim(ClaimTypes.Name, user.Name),new Claim(ClaimTypes.Email, user.Email),new Claim(JwtRegisteredClaimNames.Exp, ${new DateTimeOffset(DateTime.Now.AddMinutes(AppSettings.JWT.Expires)).ToUnixTimeSeconds()}),new Claim(JwtRegisteredClaimNames.Nbf, ${new DateTimeOffset(DateTime.Now).ToUnixTimeSeconds()})};var key new SymmetricSecurityKey(AppSettings.JWT.SecurityKey.SerializeUtf8());var creds new SigningCredentials(key, SecurityAlgorithms.HmacSha256);var securityToken new JwtSecurityToken(issuer: AppSettings.JWT.Domain,audience: AppSettings.JWT.Domain,claims: claims,expires: DateTime.Now.AddMinutes(AppSettings.JWT.Expires),signingCredentials: creds);var token new JwtSecurityTokenHandler().WriteToken(securityToken);result.IsSuccess(token);return await Task.FromResult(result);} ...GitHub的这个API做了相应的安全机制有一点要注意一下当我们用代码去模拟请求的时候需要给他加上User-Agent不然是不会成功返回结果的。FromJsonT是之前我们添加的扩展方法将JSON字符串转为实体对象。SymmetricSecurityKey(byte[] key)接收一个byte[]参数这里也用到一个扩展方法SerializeUtf8()字符串序列化成字节序列。我们判断返回的Id是否为我们配置的用户Id如果是的话就验证成功进行授权生成Token。生成Token的代码也很简单指定了 NameEmail过期时间为30分钟。具体各项含义可以去这里看看https://tools.ietf.org/html/rfc7519。最后调用new JwtSecurityTokenHandler().WriteToken(SecurityToken token)便可成功生成Token在Controller添加好去试试吧。.../// summary/// 登录成功生成Token/// /summary/// param nameaccess_token/param/// returns/returns[HttpGet][Route(token)]public async TaskServiceResultstring GenerateTokenAsync(string access_token){return await _authorizeService.GenerateTokenAsync(access_token);} ... 将之前拿到的access_token传进去调用接口可以看到已经成功生成了token。前面为AuthController添加了一个Attribute[AllowAnonymous]代表这个Controller下的接口都不需要授权就可以访问当然你不添加的话默认也是开放的。可以为整个Controller指定同时也可以为具体的接口指定。当想要保护某个接口时只需要加上Attribute[Authorize]就可以了。现在来保护我们的BlogController下非查询接口给增删改添加上[Authorize]注意引用命名空间Microsoft.AspNetCore.Authorization。....../// summary/// 添加博客/// /summary/// param namedto/param/// returns/returns[HttpPost][Authorize]public async TaskServiceResultstring InsertPostAsync([FromBody] PostDto dto).../// summary/// 删除博客/// /summary/// param nameid/param/// returns/returns[HttpDelete][Authorize]public async TaskServiceResult DeletePostAsync([Required] int id).../// summary/// 更新博客/// /summary/// param nameid/param/// param namedto/param/// returns/returns[HttpPut][Authorize]public async TaskServiceResultstring UpdatePostAsync([Required] int id, [FromBody] PostDto dto).../// summary/// 查询博客/// /summary/// param nameid/param/// returns/returns[HttpGet]public async TaskServiceResultPostDto GetPostAsync([Required] int id)... ... 现在编译运行一下调用上面的增删改看看能不能成功这时接口就会直接给我们返回一个状态码为401的错误为了避免这种不友好的错误我们可以添加一个中间件来处理我们的管道请求或者在AddJwtBearer()中处理我们的身份验证事件机制当遇到错误的状态码时我们还是返回我们之前的创建的模型定义友好的返回错误将在后面篇章中给出具体方法。可以看到公开的API和需要授权的API小绿锁是不一样的公开的显示为黑色需要授权的显示为灰色。如果需要在Swagger中调用我们的非公开API要怎么做呢点击我们的小绿锁将生成的token按照Bearer {Token}的方式填进去即可。注意不要点Logout否则就退出了。可以看到当我们请求的时候请求头上多了一个authorization: Bearer {token}此时便大功告成了。当我们在web中调用的时候也遵循这个规则即可。特别提示在我做授权的时候token也生成成功了也在Swagger中正确填写Bearer {token}了。调用接口的时候始终还是返回401最终发现导致这个问题的原因是在配置Swagger小绿锁时一个错误名称导致的。看他的描述为A unique name for the scheme, as per the Swagger spec.(根据Swagger规范该方案的唯一名称)如图将其名称改为 oauth2 便可以成功授权。本篇接入了GitHub实现了认证和授权用JWT的方式保护我们写的API你学会了吗????????????开源地址https://github.com/Meowv/Blog/tree/blog_tutorial
http://www.zqtcl.cn/news/957970/

相关文章:

  • 阜宁专业做网站做信息网站能挣钱吗
  • wordpress 怎么手动更新宝安网站 建设seo信科
  • 腾讯的网站建设用了多少钱找人合伙做网站平台
  • 企业网站功能模块介绍服务器免费体验
  • 小程序制作收款网站结构优化的优化包括
  • 北京市建设工程质监站网站poi player wordpress
  • php网站开发工程师招聘网自己做小程序要钱吗
  • 两学一做考试网站空间网
  • 齐诺网站建设东莞网站建设做网站集团网站群
  • 网站运营策略如何做软件网站开发培训
  • 数据库型网站wordpress上传工具
  • 太原建站公司模板宁波seo公司哪家好
  • 电商网站都是用什么做的承接电商网站建设
  • c2c网站代表有哪些怎样制作个人网站
  • wordpress linux 建站安丘市建设局官方网站
  • 谁给个好网站硬件开发是什么
  • 海外网站加速器免费长春做网站优化哪家好
  • 建立网站需要多长钱电脑网页设计培训
  • 给网站划分栏目邢台做网站优化费用
  • 网群企业网站管理系统红塔区住房和城乡建设局网站
  • 濮阳网站建设在哪做沈阳百度网站的优点
  • 网站上如何做问卷调查温州建设局官方网站
  • 做一件代发哪个网站好具有品牌的福州网站建设
  • 邢台移动端网站建设犀牛建模教程
  • 华池网站建设广西柳州市
  • 泰安网站建设推荐软件商店电脑版官方下载
  • 站长平台网站报价单模板表格
  • 织梦做的网站老是被黑杭州网站设计询问蓝韵网络
  • wordpress手机版如何设置福鼎整站优化
  • 网站建设小程序定制开发北京东宏建设网站