我对asp.net核心身份框架还很陌生。许多教程、文章和指南似乎都以相同的方式处理IdentityError
。它们向用户公开错误的描述,即将错误的描述添加到ModelState
中。
我一直在想,向用户暴露错误是一个可怕的想法,因为它会增强攻击者的能力。
所以我想,这一定取决于描述中提供了什么样的信息。例如,如果错误为"您的密码太弱"或"您需要输入有效的电子邮件地址"。这种类型的信息对用户来说是有价值的,应该可以显示。然而,"数据源响应时间太长"已经是太多的信息,提供的价值很小。我宁愿捕捉这种类型的错误,并将其替换为一些通用的500错误。
所以我的问题是:向用户显示原始身份错误是否安全?如果没有,我如何筛选我应该和不应该向用户显示的内容?
我试着查看MSDN文档,以了解我可能收到的所有代码。但这些文件提供的信息很少。
我专门与合作
var userCreationResult = await userManager.CreateAsync(newUser, password);
但它适用于任何可能出现IdentityError
的实例。
许多软件质量和安全法规都对此有审计要求(向最终用户提供的错误消息中可能不包含机密信息,或者会让恶意用户破坏系统或访问敏感数据(,因此这是一个重要问题。如果有专门针对这一点的文档或文章,那么它是隐藏的。
IdentityError
类的两个成员可以假设的可能值被烘焙到框架中。因此,看起来您可以确信它将始终是其中之一,除非您从UserManager
以外的任何东西获得IdentityError
的实例。
Code
字段是从错误方法的nameof
中分配的,相关的Description
文本是从核心框架资源中读取的,因此这些文本将被本地化。
源代码
en-us描述
当前实现中的错误列表(3.0.0版(:
- 默认错误
- 并发故障
- 密码不匹配
- InvalidToken
- RecoveryCodeRedemption失败
- 已关联登录
- 无效用户名
- 无效电子邮件
- 重复用户名
- 重复电子邮件
- 无效的角色名称
- 重复文件名
- 用户AlreadyHasPassword
- 未启用用户锁定
- 用户AlreadyInRole
- UserNotInRole
- 密码TooShort
- 密码要求唯一字符
- 密码要求非字母数字
- 密码要求非字母数字
- 密码要求更低
- 密码要求上限
其中大多数都是静态字符串,不公开任何变量信息。
以下确实披露了可变信息。在前八种情况下,这是用户以前提供的数据,在后两种情况下是服务器配置属性的值,要求的最小密码长度和有效密码中要求的最小唯一字符数:
- InvalidUserName:用户名
- InvalidEmail:电子邮件地址
- DuplicateUserName:用户名
- DuplicateEmail:电子邮件地址
- InvalidRoleName:角色的名称
- DuplicateRoleName:角色的名称
- UserAlreadyInRole:角色的名称
- UserNotInRole:角色的名称
- PasswordTooShort:最小密码长度
- PasswordRequiresUniqueChars:所需的唯一字符数
如果这符合";"安全";在项目的约束和规范范围内,答案是肯定的。
关于如何做的第二个问题,您可以执行以下操作来筛选重复的用户名,当你循环通过错误
if (error.Code == _userManager.ErrorDescriber.DuplicateUserName(user.UserName).Code)
{
//Hide info to user by, e.g. redirecting to a page for a registration flow, or display an invalid login attempt for a login flow
}