搬运自我自己以前学的文章
希望能够用自己的方式把身份验证和授权的概念将明白
前言
身份验证: Authentication
授权: Authorization
net core 中的身份验证和授权这两个部分,是相辅相成的。当初我在学在部分的时候,是看的 net core 官网中的教程。得益于微软的翻译,看得我是难受至极,愣是没看明白。
在后来,我通过别的路劲学懂这两个部分之后,我再来看官网,看懂一点了。
所以,我根据我自己的理解,写下了这个身份验证和授权的简单教程,希望能够帮到你吧。
在本文中,只介绍身份验证和授权的概念性的东西,还不会涉及到具体的代码编写,毕竟,只有明白了是什么,才能知道怎么做。所以本文的目的,在于让你明白什么是身份验证和授权,至于代码编写,将在下一篇文章中展示。
明确概念
在前言中我说身份验证和授权这两个部分,是相辅相成的,我们必须先了解这两者的关系,才能知道怎么使用。
如果把我们的项目比作是一栋大楼,把项目中的接口比作是大楼中的房间,我们请求接口就是要到大楼中的某个房间里去。那么有的房间是机密房间,不能谁想进就进,来人必须证明你的身份,并且你的身份有对应权限能进到这个房间。
其中,证明来者的身份,就是 身份验证-Authentication 做的事;你的身份的权限能不能进入到这个房间,就是 授权-Authorization 做的事。
你看,这两者的关系,必须要先进行身份验证才能进行授权,如果连身份验证都没有通过,就更别提授权了。
在身份验证通过后,要怎么将身份信息传递给授权呢?就需要用到声明:Claim,这个东西。
声明-Claim
“声明”这个中文翻译很迷惑,很让人疑惑它的用途,如果改成“条目”还更好一点。
这个东西是干什么的呢?在现实中,我们会使用各种证件来证明我们的身份,比如有身份证、驾驶证、社保卡等。各种证件中都会有一条条的条目来说明持有者的相关信息,如身份证中有名字:张三;性别:男;身份证号:xxxxxxx。这每一条相关信息,就是 声明。
每一个声明都由两部分信息,一个是类型,一个值。比如:身份证中的名字这一条目,转换成声明,其类型就是“名字”,其值就是“张三”。
所以,声明-Claim 就代表了每个身份条目。
另外,在我们上面的例子中,每一种有条目的证件,叫做 ClaimsIdentity,就跟你的身份证、社保卡一样;多种证件的集合,叫做 ClaimsPrincipal,就跟你的证件包一样。
声明从哪里来
发起一个请求,经过了身份验证,得到了一个或多个声明。但是请求中这些声明是从哪里来的?总不可能是请求中凭空产生的吧。所以,在客户端携带上声明向服务器发起请求前,客户端必须先从服务器上得到声明。
好比说,不可能来个人说你是张三我就相信了,你必须携带有效证件,这个证件必须我给你发放才有效。
而最常见的发放接口其实就是登录接口啦。客户端在登录了之后就证明了它的身份,我就可以给他发放一个凭证了,客户端携带这个凭证来请求接口,经过身份验证程序,就能够知道它的声明是什么了。
声明,通过服务器下发凭证,请求其他接口时携带上凭证,经过身份验证程序而得到。得到声明后,将转交给授权程序使用。当然,也有其他的方式,但是这里为了简化概念,就从简单的声明讲起。至于其他的方式,在我们使用到的时候再提及。
授权如何使用声明
经过身份验证得到的各种声明,传递给了授权程序,授权程序就可以根据需要,来判断授权通不通过。我们这种根据声明的授权,叫做 基于声明的授权。当然也是有基于其他方式的授权的,为了简单,这里用声明来说明。
知道了这一点之后,你的授权程序,就可以根据自己的需求来编写了。如,你规定了只有持有 24 小时核酸的人才能进这个房间,那么你就要在他的声明里寻找类型为 “核酸” 的条目,如果能找到,且值是 24,就通过,准许进入!不然就一边去。
经过了授权程序后,会有两种结果,一种是通过,一种就是不通过。这个很好理解,通过的话,就会允许访问接口了;不通过的话,将会被拒绝访问。你还可以自己设定拒绝后的行为,比如你让它一边呆着去,或者让它去隔壁做个核酸再过来。
总结
至此,在本文中,我们知道了:
- 身份验证和授权的关系:需要先经过身份验证,拿到身份信息,才能进行授权。
- 在本文例子中,身份验证和授权的信息传递,通过声明来进行。
- 授权程序在根据声明进行授权判断后,有通过和不通过两种。
- 授权通过的话将允许访问对应的接口,不通过的话将被拒绝。
在下文中,我们将使用 cookie 来编写一个简单的身份验证和授权。
学学dotnet core中的身份验证和授权-2-cookie
告辞!
非常感谢作者分享这篇关于身份验证和授权的博客。我认为这篇博客非常清晰地解释了身份验证和授权的概念,并通过生动的比喻使其更易于理解。博客开头作者提到了自己曾经通过微软官网学习身份验证和授权,但由于翻译问题难以理解。这个问题可能会影响其他读者的理解,因此我建议作者可以提供一些关于官方教程的链接或参考资料,以便读者进一步学习和了解。
博客中作者介绍了身份验证和授权的关系,身份验证是在授权之前进行的,只有通过身份验证才能进行授权。这一点很重要,因为只有在验证了用户身份后,我们才能确定他们是否有权访问特定资源。此外,作者还解释了声明的概念,声明是身份验证后获得的信息,它们用于授权程序来判断用户是否有权访问资源。这个比喻很形象,使概念更加清晰。
在改进方面,我建议作者可以提供更多关于声明的具体示例,以帮助读者更好地理解声明的结构和用途。此外,博客提到了使用cookie进行身份验证和授权的下一篇文章,我期待在下一篇文章中看到更多关于具体实现的内容和示例代码。
总的来说,这篇博客对于初学者来说是一个很好的起点,它清楚地解释了身份验证和授权的概念,并提供了一个生动的比喻来帮助读者理解。我期待在以后的文章中看到更多关于具体实现和示例的内容。再次感谢作者的分享!