net core mvc6使用jwt实现简单的登录
创建一个新的.NET Core Web应用程序项目。在创建项目时,选择MVC模板。
在项目中添加Microsoft.AspNetCore.Authentication.JwtBearer包:
在Visual Studio中,可以通过NuGet包管理器添加这个包:Tools > NuGet Package Manager > Manage NuGet Packages for Solution。
在NuGet 包管理器中搜索Microsoft.AspNetCore.Authentication.JwtBearer,选择安装。
可以通过以下命令在CLI中添加该包:
dotnet add package Microsoft.AspNetCore.Authentication.JwtBearer
- 在appsettings.json文件中添加JWT配置项:
"JWTSetting": {
"Issuer": "MyIssuer",
"Audience": "MyAudience",
"SecurityKey": "MySecurityKey",
"ExpireMinutes": 30
}
在这个样例中,我们为Issuer和Audience分别设置了"MyIssuer"和"MyAudience",设定了一个安全的机密SecurityKey,以及设置了一个过期时间(ExpireMinutes)。您可以根据您自己的需求调整这些选项。
- 添加JWT配置,打开Program.cs文件并添加以下代码段到Main方法中:
var builder = WebApplication.CreateBuilder(args);
var configuration = builder.Configuration;
var jwtOptions = new JWTSetting();
configuration.GetSection("JWTSetting").Bind(jwtOptions);
builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddJwtBearer(options =>
{
options.TokenValidationParameters = new TokenValidationParameters
{
ValidateIssuer = true,
ValidateAudience = true,
ValidateLifetime = true,
ValidateIssuerSigningKey = true,
ValidIssuer = jwtOptions.Issuer,
ValidAudience = jwtOptions.Audience,
IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(jwtOptions.SecurityKey))
};
});
这段代码使用AddAuthentication()和AddJwtBearer()方法来注册JWT服务。在AddJwtBearer()调用中,我们可以传入一个TokenValidationParameters对象,用于验证JWT的有效性。JWT的有效性取决于密钥、签发人、受众、过期时间和签名的有效性。
在这个样例中,我们通过appSettings对象读取了配置文件中的JWTSetting部分(即JWT的配置项),然后使用Bind方法将这些值绑定到JWTSetting对象中。最后,我们配置了验证JWT的选项
- 添加JWT生成器,打开Startup.cs文件并添加以下代码段到ConfigureServices方法中:
//添加JWT生成器服务
services.AddSingleton<IJwtGenerator, JwtGenerator>();
在这个步骤中,我们注册了一个IJwtGenerator接口的实例,并将其设置为单例模式。IJwtGenerator是一个接口,用于生成JWT令牌。
- 创建一个JwtGenerator类实现IJwtGenerator接口,在接口中实现生成JWT令牌的方法:
public interface IJwtGenerator {
string GenerateToken(User user);
}
public class JwtGenerator: IJwtGenerator {
private readonly IConfiguration config;
public JwtGenerator(IConfiguration config) {
this.config = config;
}
public string GenerateToken(User user) {
var tokenHandler = new JwtSecurityTokenHandler();
var key = Encoding.ASCII.GetBytes(config["JWTSetting:SecurityKey"]);
var tokenDescriptor = new SecurityTokenDescriptor {
Subject = new ClaimsIdentity(new Claim[] {
new Claim(ClaimTypes.NameIdentifier, user.Id.ToString()),
new Claim(ClaimTypes.Name, user.UserName)
}),
Expires = DateTime.UtcNow.AddMinutes(double.Parse(config["JWTSetting:ExpireMinutes"])),
SigningCredentials = new SigningCredentials(new SymmetricSecurityKey(key), SecurityAlgorithms.HmacSha256Signature)
};
var token = tokenHandler.CreateToken(tokenDescriptor);
return tokenHandler.WriteToken(token);
}
}
- 在您的控制器中,使用[Authorize]属性限制访问。例如:
[AllowAnonymous]
[HttpPost]
public async Task<ActionResult<string>> Login([FromBody] LoginDto loginDto)
{
var user = await _userManager.FindByNameAsync(loginDto.UserName);
if (user != null && await _userManager.CheckPasswordAsync(user, loginDto.Password))
{
var token = _jwtGenerator.GenerateToken(user);
return Ok(token);
}
return Unauthorized();
}
[Authorize]
[HttpGet]
public async Task GetSomething() {
//your action code
}
此时,只有经过身份验证并得到授权的用户才能访问您的控制器操作。
在前端代码中,需要创建一个登录页面,以便用户可以输入用户名和密码进行身份验证。在用户单击“登录”按钮时,需要向服务器发送HTTP POST请求,以便验证用户的身份并获取JWT令牌。如果身份验证成功,则将JWT令牌保存在本地存储中,并将用户重定向到受保护的页面。如果身份验证失败,则应显示错误消息。
以下是一个简单的登录页面的示例代码:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Login</title>
</head>
<body>
<h1>Login</h1>
<form id="login-form">
<div>
<label for="username">Username:</label>
<input type="text" id="username" name="username" required>
</div>
<div>
<label for="password">Password:</label>
<input type="password" id="password" name="password" required>
</div>
<button type="submit">Login</button>
</form>
<div id="error-message" style="display: none; color: red;"></div>
<script>
var form = document.getElementById('login-form');
var errorMessage = document.getElementById('error-message');
form.addEventListener('submit', function(event) {
event.preventDefault();
var username = document.getElementById('username').value;
var password = document.getElementById('password').value;
var xhr = new XMLHttpRequest();
xhr.open('POST', '/api/login', true);
xhr.setRequestHeader('Content-Type', 'application/json');
xhr.onreadystatechange = function() {
if (xhr.status === 200) {
var response = JSON.parse(xhr.responseText);
localStorage.setItem('jwt', response.token);
window.location.href = '/protected-page.html';
} else {
errorMessage.textContent = 'Invalid username or password.';
errorMessage.style.display = 'block';
}
};
xhr.send(JSON.stringify({username: username, password: password}));
});
</script>
</body>
</html>
net core mvc6使用jwt实现简单的登录的更多相关文章
- 如何简单的在 ASP.NET Core 中集成 JWT 认证?
前情提要:ASP.NET Core 使用 JWT 搭建分布式无状态身份验证系统 文章超长预警(1万字以上),不想看全部实现过程的同学可以直接跳转到末尾查看成果或者一键安装相关的 nuget 包 自上一 ...
- .NetCore WebApi——基于JWT的简单身份认证与授权(Swagger)
上接:.NetCore WebApi——Swagger简单配置 任何项目都有权限这一关键部分.比如我们有许多接口.有的接口允许任何人访问,另有一些接口需要认证身份之后才可以访问:以保证重要数据不会泄露 ...
- ASP.NET Core WebApi基于JWT实现接口授权验证
一.ASP.Net Core WebApi JWT课程前言 我们知道,http协议本身是一种无状态的协议,而这就意味着如果用户向我们的应用提供了用户名和密码来进行用户认证,那么下一次请求时,用户还要再 ...
- ASP.NET Core 2.1 JWT Token 使用 (二) - 简书
原文:ASP.NET Core 2.1 JWT Token 使用 (二) - 简书 接上文,https://www.jianshu.com/p/c5f9ea3b4b65 ASP.NET Core 2. ...
- asp.net core使用identity+jwt保护你的webapi(三)——refresh token
前言 上一篇已经介绍了identity的注册,登录,获取jwt token,本篇来完成refresh token. 开始 开始之前先说明一下为什么需要refresh token. 虽然jwt toke ...
- ASP.Net Core MVC6 RC2 启动过程分析[偏源码分析]
入口程序 如果做过Web之外开发的人,应该记得这个是标准的Console或者Winform的入口.为什么会这样呢? .NET Web Development and Tools Blog ASP.NE ...
- Net Core MVC6 RC2 启动过程分析
入口程序 如果做过Web之外开发的人,应该记得这个是标准的Console或者Winform的入口.为什么会这样呢?.NET Web Development and Tools Blog ASP.NET ...
- 一个基于 .NET Core 2.0 开发的简单易用的快速开发框架 - LinFx
LinFx 一个基于 .NET Core 2.0 开发的简单易用的快速开发框架,遵循领域驱动设计(DDD)规范约束,提供实现事件驱动.事件回溯.响应式等特性的基础设施.让开发者享受到正真意义的面向对象 ...
- .net core使用ocelot---第一篇 简单使用
简介原文地址 接下来你会学习,基于asp.net core 用Ocelot实现一个简单的API网关.或许你会疑问什么是API网关,我们先看下面的截图 API网关是访问你系统的入口,它包括很多东西,比如 ...
- Net Core Identity 身份验证:注册、登录和注销 (简单示例)
一.前言 一般我们自己的系统都会用自己设置的一套身份验证授权的代码,这次用net core的identity来完成简单的注册.登录和注销. 二.数据库 首先就是创建上下文,我这里简单的建了Users和 ...
随机推荐
- Typecho 博客文章评论添加显示 UserAgent(UA)的功能
本篇文章实现了为 Typecho 博客文章评论添加显示 UserAgent(UA)的功能 本功能可替代 UserAgent 插件,更美观.简洁且好看 效果显示 大概就是这样了,实际效果请看我的评论! ...
- Typecho的Joe主题新增QQ打开自动跳转到浏览器
前言 QQ抽风,很多站长的网站都被屏蔽白了,我的也不例外 而且很多人上午解了下午又白,所以我就想做一个跳转,跳转到浏览器访问 然后看到执念有教程,就直接搬过来了,也就当做个备份吧 效果图 QQ内打开: ...
- MybatisPlus - [02] HelloWorld
参考:https://www.cnblogs.com/haoxinyue/p/5208136.html(分布式系统唯一ID生成方案汇总) 一.准备工作 (1)创建数据库: create databas ...
- win7系统清理C盘空间方法实测
问题描述:win7电脑C盘容易满,采用如下方法清理 方法一:win+r,输入%temp%查看临时文件,手动删除不需要的文件 方法二:减小休眠文件:如果你很少使用休眠模式,可以通过win+r输入cmd命 ...
- Mpmath库-学习笔记
目录 mpmath库学习 1. Introduction 1.2 Basic usage of mpmath 1.3 输出格式化 1.4 输出的小数点位数 2. BASIC FEATURES 2.1 ...
- 记线上+线下培训思想i技巧感悟
刚刚结束一场线下+线上培训 梳理一下,有几个问题: 1.虽然课件自己过了几遍,同时备注里写了一些提示 ,但是真正讲课的时候基本是没有过程特意去扫备注 注意备注应清晰,写核心关键字 2.分屏过程 需要在 ...
- 基于近红外与可见光双目摄像头的活体人脸检测,文末附Demo
基于近红外与可见光双目摄像头的活体人脸检测原理 人脸活体检测(Face Anti-Spoofing)是人脸识别系统中的重要一环,它负责验证捕捉到的人脸是否为真实活体,以抵御各种伪造攻击,如彩色纸张打印 ...
- Web前端入门第4问:HTML、CSS、JavaScript 的作用分别是什么?
HTML.CSS.JavaScript 的核心作用 HTML:网页的骨架 功能:定义页面的内容结构(如按钮.表格.图片). 示例:<button>提交</button> 创建一 ...
- mongodb查询某个字段数据
如下 db.集合名.find( {}, {需要查询的字段:1, _id:0} ) 例如 db.userInfo.find({}, {'created_at':1, _id: 0}) 默认会显示 _id ...
- 使用 bc4 解决 git 合并冲突问题
博客地址:https://www.cnblogs.com/zylyehuo/ STEP1:安装 beyond compare 安装地址: https://www.scootersoftware.com ...