介绍
AspNetCore WebApi认证与授权的方法?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。
<强>什么是标记强>
标记是服务端生成的一串字符串,以作客户端进行请求的一个令牌,当第一次登录后,服务器生成一个令牌便将此令牌返回给客户端,以后客户端只需带上这个令牌前来请求数据即可,无需再次带上用户名和密码。
Json web标记(JWT),是为了在网络应用环境间传递声明而执行的一种基于Json的开放标准((RFC 7519)。该令牌被设计为紧凑且安全的,特别适用于分布式站点的单点登录(SSO)场景.JWT的声明一般被用来在身份提供者和服务提供者间传递被认证的用户身份信息,以便于从资源服务器获取资源,也可以增加一些额外的其它业务逻辑所必须的声明信息,该令牌也可直接被用于认证,也可被加密。
从图中可以看出主要有两部分组成:1,获取令牌,2,通过令牌进行授权。
首先,安装JwtBearer包。
dotnet Microsoft.AspNetCore.Authentication添加包。JwtBearer——版本3.1.0
接下来,定义一个配置类,我这里为了简单直接用常量代替了,你也可以放在配置文件中。
TokenParameter公共类 { 公共常量字符串发行人=吧疃嚷肱?//颁发者 公共常量字符串观众=吧疃嚷肱?//接收者 公共常量字符串秘密=?234567812345678“;//签名秘钥 公共常量int AccessExpiration=30;//AccessToken过期时间(分钟) }
接下来,定义一个通过用户名和密码,获取令牌的控制器。
[路线(“api/oauth")] (ApiController) 公开课OAuthController: ControllerBase {///& lt; summary>///获取令牌///& lt;/summary>///& lt; returns> & lt;/returns> (HttpGet) (路线(“token")) 公共ActionResult GetAccessToken(用户名的字符串,字符串密码) {//这儿在做用户的帐号密码校验。我这儿略过了。 如果用户名!=癮dmin"| |密码!=癮dmin") 返回BadRequest(“无效Request"); var声明=new [] { 新索赔(ClaimTypes。名称、用户名) 新索赔(ClaimTypes。角色,““), }; var关键=new SymmetricSecurityKey (Encoding.UTF8.GetBytes (TokenParameter.Secret)); var=new SigningCredentials凭证(关键,SecurityAlgorithms.HmacSha256); var jwtToken=new JwtSecurityToken (TokenParameter。发行人,TokenParameter。观众,声称,到期:DateTime.UtcNow.AddMinutes (TokenParameter.AccessExpiration) signingCredentials:凭证); var牌=new JwtSecurityTokenHandler () .WriteToken (jwtToken); 返回Ok(令牌); } }
接下来,添加牌身份认证到容器(启动。ConfigureServices)。
服务。AddAuthentication (x=比; { x。DefaultAuthenticateScheme=JwtBearerDefaults.AuthenticationScheme; x。DefaultChallengeScheme=JwtBearerDefaults.AuthenticationScheme; })。AddJwtBearer (x=比; { x。RequireHttpsMetadata=https://www.yisu.com/zixun/false; x。SaveToken=true; x。TokenValidationParameters=new TokenValidationParameters { ValidateIssuerSigningKey=true,//是否调用对签名securityToken的SecurityKey进行验证 IssuerSigningKey=new SymmetricSecurityKey (Encoding.ASCII.GetBytes (TokenParameter.Secret)),//签名秘钥 ValidateIssuer=true,//是否验证颁发者 ValidIssuer=TokenParameter。发行人,//颁发者 ValidateAudience=true,//是否验证接收者 ValidAudience=TokenParameter.Audience//接收者 ValidateLifetime=true,//是否验证失效时间 }; });
接下来,添加身份认证到中间件(启动。配置)。
app.UseAuthentication();//必须在app.UseAuthorization();之前
接下来,控制器需要授权控制的添加(授权)。
[HttpGet (“{id}“) (授权) 公共异步Task比;GetTodo (Guid id) { var todo=等待context.Todo.FindAsync (id); 如果(todo==null) { 返回NotFound (); } 返回待办事项; }
最后,我们测试一下接口,效果如下。
这时会返回401年,因为身份认证没有通过,说明身份验证起效果了。