我有一个asp.net Web Api 2 / Identity 2应用程序,需要用户进行身份验证。验证工作,但我注意到,当我重新启动本地开发机器并尝试访问需要验证的方法时,我得到了失败。
由于我的应用程序与asp.net示例相同,因此我认为它使用cookie在客户端上存储用户数据。服务器或IIS如何以及如何存储有关哪些用户已通过身份验证的信息?它是仅仅执行一次还是每次HTTP?我在服务器上检查身份验证和授权的方式使用令牌或cookie身份验证之间有区别吗?
答案 0 :(得分:8)
我认为您误解了身份验证如何与ASP.Net一起使用。举个例子,让我向你展示一些使用Identity的网站的cookie细节(注意令牌实际上是在cookie中,两者不是相互排斥的概念):
Name __RequestVerificationToken
Value afeILhaIvRr56jXXXXXXXXXXX
Host site.azurewebsites.net
Path /
Expires At end of session
请注意,默认情况下,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
答案 1 :(得分:5)
扩展Chris的优秀答案,我想补充一点,这里有两种可能的模型。在表单身份验证(这是asp.net的默认成员身份类型)中,cookie可以存储身份验证信息,然后将其称为故障单,或者信息可以存储在会话中,其中cookie是&的简单标识符。 #34;重新连接"在每个后续请求中与请求客户端进行身份验证的会话。
这"重新连接"发生在Application_AuthenticateRequest
的{{1}}方法中。如果您使用的是默认表单身份验证存储,即框架为您创建的SQL DB,则重新连接将自动完成。如果您使用自定义身份验证存储(如自己访问活动目录或自定义用户表结构),则可以覆盖该方法并使用您自己的实现重新连接经过身份验证的会话。在任何情况下,身份验证数据都填充在global.asax
对象的不同属性中。从那时起,如果您使用User.Identity
属性,框架将访问该对象以检查用户是否确实已经过身份验证和授权。
无论如何,身份验证信息都与cookie和会话相关联。假设你的会话是[Authorize]
,就像Chris说的那样,当会话丢失时(通过超时,应用程序池回收或重启dev机器)会话的服务器端丢失并且你的身份验证/会话cookie被替换在下一个请求中使用新的。
编辑:哦......还有一个评论。确保区分身份验证和授权。客户端不会在每个请求上重新进行身份验证。身份验证是提供凭据并由服务器识别的过程。授权是,现在服务器已经验证了您的身份,在每次请求时它会检查您是否有权访问您请求的资源。
答案 2 :(得分:4)
服务器不存储有关谁经过身份验证以及谁未经过身份验证的信息。通常,当用户登录时,服务器将返回某种形式的身份验证令牌,客户端应在每次API调用时将其传递回服务器,具体取决于您的身份验证机制(表单,令牌?)。
在不了解您的配置的情况下,很难解释为什么当您重新启动服务器时必须重新进行身份验证时,听起来服务器生成的身份验证令牌在重新启动时会失效。
答案 3 :(得分:3)
服务器或IIS如何以及如何存储有关哪些用户已通过身份验证的信息?
IIS不会根据Cookie身份验证存储状态。一切都是根据要求确定的。请求具有正确的加密信息,或者它没有。如果您在ASP.NET中查看默认的Forms身份验证,您将找到一个名为.ADUAUTH的cookie ...此cookie具有验证请求的所有信息。如果cookie已过半,它将被重置,但所有IIS都会重置。
它只在一次或每次HTTP上执行此操作吗?
每个HTTP请求都是唯一的,所以是的,每个HTTP请求。
我在服务器上检查身份验证和授权的方式使用令牌或cookie身份验证之间有区别吗?
始终在服务器上进行检查:要了解更多信息,请查看:ASP.NET安全工作原理:http://msdn.microsoft.com/en-us/library/ks310b8y.ASPX
答案 4 :(得分:3)
我认为我的答案可能与上述所有内容相矛盾。但我认为如果我理解正确的话......
IIS存储在ASP.NET辅助进程的内存空间内,即RAM中的会话数据。
身份验证状态的存储取决于您使用的身份验证模型。例如:如果您通过ADFS使用联合身份验证,那么当用户加载您的网页时,他需要登录才能提供其凭据。然后,ADFS设置存储在会话数据中的认证令牌,会话ID作为cookie存储在用户的浏览器中。服务器具有会话ID到其会话数据的映射。
现在用户已通过身份验证。 ADFS查找身份验证令牌以将用户标记为已通过身份验证。
当您重新启动服务器时,会话数据会丢失,因为数据存储在RAM中。
有办法解决这个问题,有3种类型的会话存储: 1. InProc(存储在ASP .NET工作进程的内存空间 - RAM中) 2.状态服务器(存储在ASP .NET工作进程的一面,就像在云Azure存储上一样) 3. SQL Server会话存储(存储在SQL服务器中)
我认为你正在采用1,因为你遇到了问题。 在情况2和3中,重新启动服务器时会话不会丢失。
答案 5 :(得分:2)
有几件事 -
基于令牌的身份验证不是真正的身份验证。它只是向您发送一个唯一的令牌(可以是一个guid,唯一的字符串等),然后将它与某些东西(如您的IP地址)相关联并保存该关联服务器端(在数据库中?)。现在,无论何时使用该令牌,服务器都会从客户端应用程序检查已存储的关联并提供或拒绝或请求。
在许多方面,它与使用Cookie来维护身份验证非常相似。只有,token-auth的设计更多用于Web服务操作,而不是用于UI。
答案 6 :(得分:2)
简而言之:开箱即用,会员提供商将运行它的身份验证方法,一旦成功,它将创建一个将从站点存储的身份验证票证/令牌/ cookie。除此之外,还有一个与网站一起存储的会话cookie。当您发出页面请求时,它会提取这些内容并使用它们来确定您是否已经过身份验证。如果它找到了票证并且发现票证仍然存在,那么它将允许访问。
当您重新启动本地环境时,会话及其信息将被销毁,这就是您必须重新登录的原因。
框架中有一个完整的管道可以使所有这些事情发生(与身份验证,授权和身份有关),并且互联网上有很多可以解释这个问题的文章,但是imo,它们几乎是都不完整或难以遵循。如果你想要一个很棒的解释,PluralSight.com有一些培训视频可以为你解构和解释整个管道。了解管道可以帮助您实现自己的自定义身份验证,我强烈推荐它。