ASP。NET Core标识:支持JWT令牌进行用户身份验证

介绍

这是关于ASP系列文章的第三篇文章。网络核心身份:

ASP。NET Core标识:启动asp.net CoreNET Core标识:建立一个web项目和标识数据库NET Core标识:用户注册,登录和注销功能使用ASP。asp.net Core mvc asp.net。angular 4:使用JWT令牌进行用户身份验证angular 4:使用外部提供者进行用户身份验证

在前面的步骤中,我们创建了一个ASP。具有登录/注销功能的asp.net Core MVC网站。网络核心的身份。我们构建的MVC网站使用了基于cookie的身份验证,这在这个场景中工作得很好。但是对于许多其他场景(比如使用移动应用程序的安全API),基于cookie的方法不是一个好的选择。对于这些场景,一种流行的方法是基于令牌的身份验证。在这一步中,我们将向项目中添加用于身份验证的jwt令牌生成功能。

我不打算详细解释什么是JWT令牌,以及它与基于cookie的方法有何不同,因为有很多关于这个主题的好文章。如果你感兴趣,你可以看看这些文章:

https://auth0.com/blog/angularjs——验证——饼干- vs token/ https://auth0.com/blog/ten - -你应该知道- -令牌和cookies/ https://medium.com/vandium software/5 -简单的步骤- -理解- json - web标记智威汤逊- 1164 c0adfcec

本文的完整代码可在此回购https://github.com/ra1han/aspnet- coreidentity中的Demo 3文件夹中获得。

在启动时准备服务

要启用JWT令牌生成,我们必须为标识中间件配置服务。但是如果我们查看Startup类中ConfigureServices方法的当前实现,就会发现没有对cookie的配置。

那么基于cookie的认证是如何工作的呢?这是有效的,因为如果我们不手动配置它,默认行为是基于Cookie的认证。

我们将使用服务。在ConfigureServices方法中添加身份验证以添加其他身份验证方案。

隐藏,收缩,复制Codepublic void ConfigureServices(IServiceCollection services)
{
services.AddDbContext(options =>
options.UseSqlServer(Configuration.GetConnectionString(“DefaultConnection”)));

services.AddIdentity<applicationuser, identityrole="">()
										.AddEntityFrameworkStores<applicationdbcontext>()
										.AddDefaultTokenProviders();

services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
		.AddCookie()
		.AddJwtBearer(jwtBearerOptions =>
		{
			jwtBearerOptions.TokenValidationParameters = new TokenValidationParameters()
			{
				ValidateActor = false,
				ValidateAudience = false,
				ValidateLifetime = true,
				ValidateIssuerSigningKey = true,
				ValidIssuer = Configuration["Token:Issuer"],
				ValidAudience = Configuration["Token:Audience"],
				IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes
                                                   (Configuration["Token:Key"]))
			};
		});

services.AddMvc();

}

准备控制器

现在,我们将添加两个新的web API控制器:

TokenController—匿名访问,用户使用它来检索JWT令牌greetingcontroller—安全且只能使用JWT令牌身份验证方案访问

TokenController中的令牌生成代码:

隐藏,收缩,复制Code[HttpPost]
public async Task Get(LoginViewModel model)
{
if (ModelState.IsValid)
{
var user = await _userManager.FindByEmailAsync(model.Email);
if (user != null)
{

		var result = await _signInManager.CheckPasswordSignInAsync
                        (user, model.Password, lockoutOnFailure: false);

		if (!result.Succeeded)
		{
			return Unauthorized();
		}

		var claims = new[]
		{
			new Claim(JwtRegisteredClaimNames.Sub, model.Email),
			new Claim(JwtRegisteredClaimNames.Jti, Guid.NewGuid().ToString())
		};

		var token = new JwtSecurityToken
		(
			issuer: _configuration["Token:Issuer"],
			audience: _configuration["Token:Audience"],
			claims: claims,
			expires: DateTime.UtcNow.AddDays(60),
			notBefore: DateTime.UtcNow,
			signingCredentials: new SigningCredentials(new SymmetricSecurityKey
                        (Encoding.UTF8.GetBytes(_configuration["Token:Key"])),
					SecurityAlgorithms.HmacSha256)
		);

		return Ok(new { token = new JwtSecurityTokenHandler().WriteToken(token) });
	}
}

return BadRequest();

}

使用API

现在来测试我们的实现,我们将使用邮差。

首先,我们将尝试从postman访问Greeting API (http://localhost:36946/api/ Greeting)。我们将看到我们得到未经授权的错误。

现在,让我们从令牌API (http://localhost:36946/api/token)创建一个令牌。我们将提供用户名和密码,API将返回承载令牌。

现在让我们用承载令牌再次调用Greeting API。

它工作!在下一篇文章中,我们将创建一个Angular 4项目,其中包含在这一步中开发的用户身份验证功能。

本文转载于:http://www.diyabc.com/frontweb/news17310.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值