在 Asp.Net Core 中什么是认证和授权
认证(Authentication) 和 授权(Authorization)在 Asp.Net core 充当了两个不同的职责。有的老伙计在理解的时候还存在误解。本文我们将会通过一些简单的例子来说明这两个概念。
认证(Authentication)识别你是谁,授权(Authorization)决定你能做什么
加入 A 用户现在通过浏览器想要访问时总的网站,这个时候我们需要知道他是谁,也就是认证。如果他是一个普通用户,那么他只能访问一些公开的页面,如果他是管理员,那么他可以访问一些管理员的页面。这个时候我们需要知道他能做什么,也就是授权。
因此,认证是指识别用户的身份,而授权是指决定用户能做什么。
特别说明,识别你是谁的意思是,你可能被识别为一个普通用户,也可能被识别为一个管理员,也可能被识别为一个游客(匿名用户)。
脱离 Asp.Net Core 认证还有另外一层意思
我们常见的 OAuth2.0 认证、OpenID Connect 认证,账号密码认证,二维码认证等等,这些认证其实是用户与系统交互而产生凭据的过程。这些凭据可以是一个 token,也可以是一个 cookie,也可以是一个 session。这些凭据都是用来识别用户身份的。
为了区别这种情况,我们将前者在本文中称为“登录方式”,后者称为“认证方式”。
而在 Asp.Net Core 中,认证是指请求中的凭据如何被转换为一个 Principal 或者 Identity 对象。所以我们会见到 Claims-based authentication,也就是基于声明的认证。
所以实际上整个过程,可以理解为:用户通过登录方式登录,如果登录成功,那么系统会产生一个凭据,这个凭据拒绝与采用的认证方式有关,而是与 Asp.Net Core 中的认证方式有关。
举一些例子:
用户通过基于账号密码的 OAuth2.0 认证登录,那么系统会产生一个 JWT token, 然后我们使用 JWT bearer 认证方式,将这个 token 作为凭据,然后 Asp.Net Core 会将这个 token 转换为一个 Principal 或者 Identity 对象。
用户通过手机扫码的方式登录,那么系统会产生一个 session,然后我们使用 cookie 认证方式,将这个 session 作为凭据保存在 Cookie 中,然后 Asp.Net Core 会将这个 Cookie 转换为一个 Principal 或者 Identity 对象。
但其实我也可以这样:用户通过基于账号密码的 OAuth2.0 认证登录,那么系统会产生一个 JWT token, 然后我们使用 cookie 认证方式,将这个 token 作为凭据保存在 Cookie 中,然后 Asp.Net Core 会将这个 token 转换为一个 Principal 或者 Identity 对象。
一些情况
那么结合以上情况,我们来鉴别一些词语的意思:
Digest authentication: 一种认证方式,它是基于账号密码的,但是密码不是明文传输的,而是通过哈希算法计算出来的。
JWT bearer authentication: 一种认证方式,它是基于 JWT token 的,但是 token 不是保存在 Cookie 中的,而是保存在 Authorization header 中。
Asp.net Cookie authentication: 一种认证方式,它是基于 Cookie 的, 通过密钥对 Cookie 进行加密,然后将加密后的 Cookie 保存在浏览器中。
总结
在 Asp.Net Core 中,认证是识别用户身份的过程,授权是决定用户是否有权限访问资源的过程。
参考资料
感谢您的阅读,如果您觉得本文有用,请点赞、关注和转发;更多精彩内容请关注我的博客 https://www.newbe.pro 和 https://github.com/newbe36524/newbe36524。
本文作者: newbe36524
本文链接: https://www.newbe.pro/Others/0x018-what-is-authentication-and-authorization-in-aspnetcore/
版权声明: 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
版权声明: 本文为 InfoQ 作者【newbe36524】的原创文章。
原文链接:【http://xie.infoq.cn/article/a8469f8e76ba80704195d2099】。
本文遵守【CC BY-NC-SA】协议,转载请保留原文出处及本版权声明。
评论