Sam*_*tar 4 asp.net iis asp.net-web-api
我有一个asp.net Web Api 2/Identity 2应用程序,需要用户进行身份验证.验证工作,但我注意到,当我重新启动本地开发机器并尝试访问需要验证的方法时,我得到了失败.
由于我的应用程序与asp.net示例相同,因此我认为它使用cookie在客户端上存储用户数据.服务器或IIS如何以及如何存储有关哪些用户已通过身份验证的信息?它是仅仅执行一次还是每次HTTP?我在服务器上检查身份验证和授权的方式使用令牌或cookie身份验证之间有区别吗?
我认为您误解了身份验证如何与ASP.Net一起使用.举个例子,让我向你展示一些使用Identity的网站的cookie细节(注意令牌实际上在cookie中,这两个不是互斥的概念):
Name __RequestVerificationToken
Value afeILhaIvRr56jXXXXXXXXXXX
Host site.azurewebsites.net
Path /
Expires At end of session
Run Code Online (Sandbox Code Playgroud)
请注意,默认情况下,Cookie会在会话结束时到期.这意味着当您重新启动开发计算机时,您的cookie已过期且您的令牌不再有效.
特别是我已经阅读过令牌认证,因此每次向服务器发出请求时都不需要进行连续的重新认证
您需要了解HTTP是无状态协议.每个请求都是在真空中发生的,因此您需要将一些数据传递回服务器,以便它可以告诉使用请求A进行身份验证的人确实是请求B的发起者.几乎总是,该数据来自曲奇饼.因此,每个请求确实都会重新进行身份验证,并且通常使用cookie中的令牌.
存储在客户端上的关于会话的唯一数据是cookie(除非你做了非典型的事情).其余的都在服务器上.它的存储方式可能有所不同:
Inproc:最容易设置,会话存储在进程中.因此,当您的服务器或应用程序池重新启动时,该数据将消失
状态服务器模式:会话存储在进程中,但在ASP.Net工作进程之外,因此可以重新启动应用程序而不会丢失会话数据
SQL Server:不出所料,它将数据存储在数据库中.非常有弹性,但设置工作量更大.如果您在网络农场,也是您的最佳选择.
参考:http://msdn.microsoft.com/en-us/library/vstudio/ms178586( v = vs.100).aspx
扩展了Chris的优秀答案,我想补充一点,这里有两种可能的模型.在表单身份验证(这是asp.net的默认成员身份类型)中,cookie可以存储身份验证信息,然后称为故障单,或者信息可以存储在会话中,其中cookie是"重新连接"经过身份验证的简单标识符每个后续请求与请求客户端的会话.
这种"重新连接"发生在Application_AuthenticateRequest方法中global.asax.如果您使用的是默认表单身份验证存储,即框架为您创建的SQL DB,则重新连接将自动完成.如果您使用自定义身份验证存储(如自己访问活动目录或自定义用户表结构),则可以覆盖该方法并使用您自己的实现重新连接经过身份验证的会话.在任何情况下,身份验证数据都填充在User.Identity对象的不同属性中.从那时起,如果使用该[Authorize]属性,框架将访问该对象以检查用户是否确实经过身份验证和授权.
无论如何,身份验证信息都与cookie和会话相关联.假设你的会话InProc就像Chris说的那样,当会话丢失时(通过超时,应用程序池回收或重启dev机器)会话的服务器端丢失,你的身份验证/会话cookie被新的会话cookie替换.下一个请求.
编辑:哦......还有一个评论.确保区分身份验证和授权.客户端不会在每个请求上重新进行身份验证.身份验证是提供凭据并由服务器识别的过程.授权是,现在服务器已验证您是谁,在每个请求上它检查您是否有权访问您请求的资源.
| 归档时间: |
|
| 查看次数: |
1397 次 |
| 最近记录: |