c# - 暴露来自 `IdentityError` 类的消息是否可以?

标签 c# security asp.net-core error-handling asp.net-identity

我对 asp.net 核心身份框架还很陌生。许多教程、文章和指南似乎都以相同的方式处理 IdentityError。它们向用户公开错误的描述,即将错误的描述添加到 ModelState

我的脑海里一直在提醒,将错误暴露给用户是一个糟糕的主意,因为它会为攻击者提供支持。

所以我想,这一定取决于描述中提供了什么样的信息。例如,如果错误是“您的密码太弱”或“您需要输入有效的电子邮件地址”。这种类型的信息对用户很有值(value),应该可以显示。然而,“数据源响应时间太长”已经是太多的信息并且没有提供什么值(value)。我宁愿捕获这种类型的错误并将其替换为一些通用的 500 错误。

所以我的问题是:向用户显示原始身份错误是否安全?如果不是,我该如何过滤应该和不应该向用户显示的内容?

我试着查看 MSDN docs了解我可能收到的所有可能代码。但是这些文档提供的信息很少。

我专门与

var userCreationResult = await userManager.CreateAsync(newUser, password);

但它适用于可能出现 IdentityError 的任何实例。

最佳答案

许多软件质量和安全法规对此有审计要求(向最终用户显示的任何错误消息都可能包含 secret 信息或使用户有恶意破坏系统或访问敏感数据的信息),因此这是一个重要的问题。如果有专门针对此问题的文档或文章,那么它就隐藏得很好。

IdentityError 类的两个成员可以假定的可能值已嵌入到框架中。所以看起来你可以确定它永远是其中之一,除非你从 UserManager 以外的任何地方获得 IdentityError 的实例。

Code字段是从错误方法的nameof中赋值的,相关的Description文本是从核心框架资源中读取的,所以那些将被本地化。

Source Code
en-us Descriptions

当前实现中的错误列表(版本 3.0.0):

  • 默认错误
  • 并发失败
  • 密码不匹配
  • 无效 token
  • RecoveryCodeRedemptionFailed
  • LoginAlreadyAssociated
  • 无效的用户名
  • 无效的邮箱
  • 重复用户名
  • 重复邮件
  • 无效角色名
  • DuplicateRoleName
  • 用户已有密码
  • UserLockoutNotEnabled
  • UserAlreadyInRole
  • UserNotInRole
  • 密码太短
  • PasswordRequiresUniqueChars
  • 密码需要非字母数字
  • 密码需要非字母数字
  • 密码要求较低
  • 密码要求上限

其中大部分是静态字符串,不会泄露任何可变信息。

以下确实公开了可变信息。在前八种情况下,这是用户以前提供的数据,在后两种情况下,服务器配置属性的值、所需的最小密码长度和有效密码中所需的最小唯一字符数:

  • InvalidUserName:用户名
  • InvalidEmail: 电子邮件地址
  • DuplicateUserName: 用户名
  • DuplicateEmail:电子邮件地址
  • InvalidRoleName:角色名称
  • DuplicateRoleName:角色名称
  • UserAlreadyInRole: 角色名称
  • UserNotInRole: 角色名称
  • PasswordTooShort:最小密码长度
  • PasswordRequiresUniqueChars:要求的唯一字符数

如果在您的项目的约束和规范内这符合“安全”的条件,那么答案是肯定的。

关于c# - 暴露来自 `IdentityError` 类的消息是否可以?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51350310/

相关文章:

asp.net-core - 如何检索当前响应正文长度?

c# - 如何解析其子字符串中带有粗体、斜体、下划线的 html 标记的字符串

c# - 如何根据条件在 wpf datagrid 中显示以下输出

c# - 从流中读取 XML

c# - 托管 ASP.Net 应用程序中的用户无法区分

security - 动态设置SSRS报告的数据源,无需无人值守执行帐户?

c# - "private readonly"和 "readonly private"之间有区别吗?

php - 在 PHP 中,PDO 如何防止 SQL 注入(inject)?准备好的陈述如何运作?

asp.net-core - 在csproj中定义AspNetCoreHostingModel抛出无法启动 'npm'异常

json - ASP.NET Core .NET 6 应用程序默认返回 XML 而不是 JSON