可以公开来自 `IdentityError` 类的消息吗?

Sto*_*ler 5 c# security error-handling asp.net-identity asp.net-core

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

我的脑海中不断涌现出,将错误暴露给用户是一个糟糕的主意,因为它可以增强攻击者的能力。

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

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

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

我专门与

var userCreationResult = await userManager.CreateAsync(newUser, password);
Run Code Online (Sandbox Code Playgroud)

但它适用于任何IdentityError可能出现的情况。

Cee*_* it 7

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

IdentityError类的两个成员可以假定的可能值被纳入框架。因此,看起来您可以确定它始终是其中之一,除非您IdentitiyError从 a 以外的任何其他地方获得了一个实例UserManager

Code字段是从nameof错误方法分配的,关联的Description文本是从核心框架资源中读取的,因此这些将被本地化。

源代码
en-us 描述

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

  • 默认错误
  • 并发失败
  • 密码不匹配
  • 令牌无效
  • RecoveryCodeRedemptionFailed
  • 登录已关联
  • 无效的用户名
  • 不合规电邮
  • 重复的用户名
  • 重复电子邮件
  • 无效角色名称
  • 重复角色名称
  • 用户已有密码
  • 用户锁定未启用
  • 用户已入职
  • 用户不在角色
  • 密码太短
  • PasswordRequiresUniqueChars
  • 密码需要非字母数字
  • 密码需要非字母数字
  • 密码要求较低
  • 密码需要大写

其中大部分是静态字符串,不公开任何变量信息。

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

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

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