我对 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/