我有几种不同类型的用户(InternalUser
,Clinician
和Patient
)可以登录我的网站,因此,对于每种类型的用户,我都创建了一个从ApplicationUser
继承的用户类。
如果已登录的用户访问网站的主页(https://example.com/),则MVC控制器代码需要确定用户的类型,以便它可以将重定向返回到正确的“主页”页面(https://example.com/clinician,https://example.com/patient等)。
在我看来,使用声明作为一种区分控制器中用户类型的简便,低成本的方法似乎很合理,而不必从数据库中加载当前用户。在注册用户时,我添加了一个代表用户“类型”的声明:
await _userManager.AddClaimAsync("ihi:user_type", "clinician");
然后,在控制器中,我检查索赔:
[Authorize]
public IActionResult Index()
{
if (User.HasClaim("ihi:user_type", "clinician")) return edirect("...");
if (User.HasClaim("ihi:user_type", "patient")) return Redirect("...");
if (User.HasClaim("ihi:user_type", "internal")) return Redirect("...");
throw new InternalErrorException("Logged in user is not in a recognized user role");
}
关于此方案,我有几个问题:
[Authorize]
属性和我的声明检查都依赖于查看cookie的值)。存储在该Cookie中的数据是否可以合理地防止篡改? (我希望如此,否则攻击者可以修改cookie并使用身份系统进行游戏。)答案 0 :(得分:0)
这是一种合理的方法吗?
是的,鉴于Identity cookie中包含所有声明,这是一种常见的方法。
该Cookie中存储的数据是否受到合理的篡改保护?
来自the docs:
SignInAsync创建一个加密的cookie,并将其添加到当前 响应。如果不指定AuthenticationScheme,则默认 方案。
在幕后,使用的加密是ASP.NET Core的数据 保护系统。
您可以看到here,您可以对数据保护系统进行许多配置,包括使用证书创建/保护用于加密Identity cookie的密钥,以及使用临时密钥,以便所有cookie在关闭应用程序后会永远丢失。
总体而言,除非您需要较高的安全级别,否则默认设置已足够。