15. 安全鉴权
📝 模块更新日志
-
问题修复
- 使用刷新
Token
也能通过鉴权检查严重安全Bug
4.8.8.42 ⏱️2023.08.28 #I7TII4
- 使用刷新
15.1 什么是鉴权
鉴权实际上就是一种身份认证。
由用户提供凭据,然后将其与存储在操作系统、数据库、应用或资源中的凭据进行比较。 在授权过程中,如果凭据匹配,则用户身份验证成功,可执行已向其授权的操作。 授权指判断允许用户执行的操作的过程。 也可以将身份验证理解为进入空间(例如服务器、数据库、应用或资源)的一种方式,而授权是用户可以对该空间(服务器、数据库或应用)内的哪些对象执行哪些操作。
15.1.1 常见的鉴权方式
HTTP Basic Authentication
这是 HTTP
协议实现的基本认证方式,我们在浏览网页时,从浏览器正上方弹出的对话框要求我们输入账号密码,正是使用了这种认证方式
Session + Cookie
利用服务器端的 session(会话)和浏览器端的 cookie 来实现前后端的认证,由于 http 请求时是无状态的,服务器正常情况下是不知道当前请求之前有没有来过,这个时候我们如果要记录状态,就需要在服务器端创建一个会话(session),将同一个客户端的请求都维护在各自的会话中,每当请求到达服务器端的时候,先去查一下该客户端有没有在服务器端创建 session,如果有则已经认证成功了,否则就没有认证。
Token
客户端在首次登录以后,服务端再次接收 HTTP
请求的时候,就只认 Token
了,请求只要每次把 Token
带上就行了,服务器端会拦截所有的请求,然后校验 Token
的合法性,合法就放行,不合法就返回 401(鉴权失败)
Token
验证比较灵活,适用于大部分场景。常用的 Token
鉴权方式的解决方案是 JWT
,JWT
是通过对带有相关用户信息的进行加密,加密的方式比较灵活,可以根据需求具体设计。
OAuth
OAuth(开放授权)是一个开放标准,允许用户授权第三方网站访问他们存储在另外的服务提供者上的信息,而不需要将用户名和密码提供给第三方网站或分享他们数据的所有内容,为了保护用户数据的安全和隐私,第三方网站访问用户数据前都需要显式的向用户征求授权。我们常见的提供 OAuth 认证服务的厂商有支付宝、QQ 和微信。
OAuth 协议又有 1.0 和 2.0 两个版本。相比较 1.0 版,2.0 版整个授权验证流程更简单更安全,也是目前最主要的用户身份验证和授权 方式。
15.2 如何使用
在添加授权服务之前,请先确保 Startup.cs
中 Configure
是否添加了以下两个中间件:
app.UseAuthentication();
app.UseAuthorization();
15.2.1 添加 Cookie
身份验证
Cookie
身份验证如果您使用的是 WebAPI
,则该小节可忽略,通常 WebAPI
使用的是 JWT
授权方式,而非 Cookie
。
// Cookies单独身份验证
services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)
.AddCookie(CookieAuthenticationDefaults.AuthenticationScheme, b =>
{
b.LoginPath = "/Home/Login";
});