jjzjj

c# - ASP.Net Identity Identity.IsAuthenticated 保持为真,即使在删除用户之后

coder 2024-06-02 原文

我按照此处的示例代码实现了 ASP.Net Identity: https://github.com/rustd/AspnetIdentitySample

在我的实现中,我检查用户是否经过身份验证——这是从我的 MVC Controller 上的 FilterAttribute 调用的;这个想法是我想在提供页面之前确认它们仍然是授权的。

所以在我的过滤器中,最终会调用以下代码:

_authenticationManager.User.Identity.IsAuthenticated;

_authenticationManager 在这里:

private IAuthenticationManager _authenticationManager
{
    get
    {
        return _httpContext.GetOwinContext().Authentication;
    }
}

_httpContext 被传递到我的 identityProvider 类的构造函数中。

现在 - 一旦我登录,_authenticationManager.User.Identity.IsAuthenticated; 按预期返回 true

但是,在开发过程中,我在没有添加用户的情况下转储并重新播种了我的数据库。如此有效,我已经删除了 IdentityUser - 但 _authenticationManager.User.Identity.IsAuthenticated; 仍然返回 true

知道这是为什么吗?我只能假设它以某种方式检查 cookie,而不是实际查看数据库。这个对吗?

或者我搞砸了我的实现......

最佳答案

这不会使 IsAuthenticated 成为安全漏洞。让我们看看实际的身份验证过程。

  1. 您在 web.config 中围绕登录页面的位置、登录的有效期以及是否使用滑动过期设置了一些内容(如果用户在您的网站上处于事件状态,是否应该延长时间)站点)

  2. 用户访问您的网站,输入他们的用户名和密码。

  3. 该信息已发布到您的服务器。您获取该信息,验证它是否正确(验证)。如果它是正确的,则服务器会发出一个加密的 cookie,称为 FormsAuthenticationTicket 注意 - 这在新的 Identity 内容中可能有不同的名称,但原理相同。

  4. Cookie 的内容包括用户名和登录到期日期等项目。

  5. 在每次请求时,服务器都会查看 cookie 集合中的身份验证 cookie。如果找到,它会对其进行解密,读取值并确定这是否仍然是一个有效的 cookie(过期时间)。一旦从 cookie 中获得用户信息,服务器就可以使用此信息来确定用户是否有权访问所请求的资源(按用户名查找)。

5a。如果 cookie 不存在或已过期,则用户将被重定向回登录页面。

6.当用户注销时,cookie从cookie集合中删除。现在,如果用户尝试访问仅供授权用户使用的资源,则服务器会在上面的 5a 处结束。

因此,在您的情况下,您手动删除了一个用户。这不会改变该用户之前已使用仍然有效的 cookie 进行身份验证的事实。因此,IsAuthenticated 返回预期值。在您更改用户状态之前,用户已经通过身份验证。 IsAuthenticated 并不意味着,这个用户在我的数据库中是否仍然有效。

如果您要运行一个经常删除/停用用户的网站,那么覆盖 AuthorizeAttributeOnRequestAuthorization 方法来查看用户是否实际上仍在数据库中。另外,请注意,如果用户名不存在(因为您删除了它),那么对角色/用户 ID 的任何查找都将失败。您可以捕获该异常/失败并返回属性未经授权的响应。

关于c# - ASP.Net Identity Identity.IsAuthenticated 保持为真,即使在删除用户之后,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21267730/

有关c# - ASP.Net Identity Identity.IsAuthenticated 保持为真,即使在删除用户之后的更多相关文章

  1. ruby-on-rails - 如何从 format.xml 中删除 <hash></hash> - 2

    我有一个对象has_many应呈现为xml的子对象。这不是问题。我的问题是我创建了一个Hash包含此数据,就像解析器需要它一样。但是rails自动将整个文件包含在.........我需要摆脱type="array"和我该如何处理?我没有在文档中找到任何内容。 最佳答案 我遇到了同样的问题;这是我的XML:我在用这个:entries.to_xml将散列数据转换为XML,但这会将条目的数据包装到中所以我修改了:entries.to_xml(root:"Contacts")但这仍然将转换后的XML包装在“联系人”中,将我的XML代码修改为

  2. ruby - 我可以使用 Ruby 从 CSV 中删除列吗? - 2

    查看Ruby的CSV库的文档,我非常确定这是可能且简单的。我只需要使用Ruby删除CSV文件的前三列,但我没有成功运行它。 最佳答案 csv_table=CSV.read(file_path_in,:headers=>true)csv_table.delete("header_name")csv_table.to_csv#=>ThenewCSVinstringformat检查CSV::Table文档:http://ruby-doc.org/stdlib-1.9.2/libdoc/csv/rdoc/CSV/Table.html

  3. ruby - 我可以使用 aws-sdk-ruby 在 AWS S3 上使用事务性文件删除/上传吗? - 2

    我发现ActiveRecord::Base.transaction在复杂方法中非常有效。我想知道是否可以在如下事务中从AWSS3上传/删除文件:S3Object.transactiondo#writeintofiles#raiseanexceptionend引发异常后,每个操作都应在S3上回滚。S3Object这可能吗?? 最佳答案 虽然S3API具有批量删除功能,但它不支持事务,因为每个删除操作都可以独立于其他操作成功/失败。该API不提供任何批量上传功能(通过PUT或POST),因此每个上传操作都是通过一个独立的API调用完成的

  4. ruby-on-rails - 使用 rails 4 设计而不更新用户 - 2

    我将应用程序升级到Rails4,一切正常。我可以登录并转到我的编辑页面。也更新了观点。使用标准View时,用户会更新。但是当我添加例如字段:name时,它​​不会在表单中更新。使用devise3.1.1和gem'protected_attributes'我需要在设备或数据库上运行某种更新命令吗?我也搜索过这个地方,找到了许多不同的解决方案,但没有一个会更新我的用户字段。我没有添加任何自定义字段。 最佳答案 如果您想允许额外的参数,您可以在ApplicationController中使用beforefilter,因为Rails4将参数

  5. ruby - 即使失败也继续进行多主机测试 - 2

    我已经构建了一些serverspec代码来在多个主机上运行一组测试。问题是当任何测试失败时,测试会在当前主机停止。即使测试失败,我也希望它继续在所有主机上运行。Rakefile:namespace:specdotask:all=>hosts.map{|h|'spec:'+h.split('.')[0]}hosts.eachdo|host|begindesc"Runserverspecto#{host}"RSpec::Core::RakeTask.new(host)do|t|ENV['TARGET_HOST']=hostt.pattern="spec/cfengine3/*_spec.r

  6. c# - 如何在 ruby​​ 中调用 C# dll? - 2

    如何在ruby​​中调用C#dll? 最佳答案 我能想到几种可能性:为您的DLL编写(或找人编写)一个COM包装器,如果它还没有,则使用Ruby的WIN32OLE库来调用它;看看RubyCLR,其中一位作者是JohnLam,他继续在Microsoft从事IronRuby方面的工作。(估计不会再维护了,可能不支持.Net2.0以上的版本);正如其他地方已经提到的,看看使用IronRuby,如果这是您的技术选择。有一个主题是here.请注意,最后一篇文章实际上来自JohnLam(看起来像是2009年3月),他似乎很自在地断言RubyCL

  7. C# 到 Ruby sha1 base64 编码 - 2

    我正在尝试在Ruby中复制Convert.ToBase64String()行为。这是我的C#代码:varsha1=newSHA1CryptoServiceProvider();varpasswordBytes=Encoding.UTF8.GetBytes("password");varpasswordHash=sha1.ComputeHash(passwordBytes);returnConvert.ToBase64String(passwordHash);//returns"W6ph5Mm5Pz8GgiULbPgzG37mj9g="当我在Ruby中尝试同样的事情时,我得到了相同sha

  8. ruby-on-rails - 简单的 Ruby on Rails 问题——如何将评论附加到用户和文章? - 2

    我意识到这可能是一个非常基本的问题,但我现在已经花了几天时间回过头来解决这个问题,但出于某种原因,Google就是没有帮助我。(我认为部分问题在于我是一个初学者,我不知道该问什么......)我也看过O'Reilly的RubyCookbook和RailsAPI,但我仍然停留在这个问题上.我找到了一些关于多态关系的信息,但它似乎不是我需要的(尽管如果我错了请告诉我)。我正在尝试调整MichaelHartl'stutorial创建一个包含用户、文章和评论的博客应用程序(不使用脚手架)。我希望评论既属于用户又属于文章。我的主要问题是:我不知道如何将当前文章的ID放入评论Controller。

  9. ruby - RVM "ERROR: Unable to checkout branch ."单用户 - 2

    我在新的Debian6VirtualBoxVM上安装RVM时遇到问题。我已经安装了所有需要的包并使用下载了安装脚本(curl-shttps://rvm.beginrescueend.com/install/rvm)>rvm,但以单个用户身份运行时bashrvm我收到以下错误消息:ERROR:Unabletocheckoutbranch.安装在这里停止,并且(据我所知)没有安装RVM的任何文件。如果我以root身份运行脚本(对于多用户安装),我会收到另一条消息:Successfullycheckedoutbranch''安装程序继续并指示成功,但未添加.rvm目录,甚至在修改我的.bas

  10. ruby - 如何安全地删除文件? - 2

    在Ruby中是否有Gem或安全删除文件的方法?我想避免系统上可能不存在的外部程序。“安全删除”指的是覆盖文件内容。 最佳答案 如果您使用的是*nix,一个很好的方法是使用exec/open3/open4调用shred:`shred-fxuz#{filename}`http://www.gnu.org/s/coreutils/manual/html_node/shred-invocation.html检查这个类似的帖子:Writingafileshredderinpythonorruby?

随机推荐