ASP.NET Core声称可靠且不受篡改吗?

时间:2018-11-03 00:39:33

标签: c# asp.net-core asp.net-core-identity

我有几种不同类型的用户(InternalUserClinicianPatient)可以登录我的网站,因此,对于每种类型的用户,我都创建了一个从ApplicationUser继承的用户类。

如果已登录的用户访问网站的主页(https://example.com/),则MVC控制器代码需要确定用户的类型,以便它可以将重定向返回到正确的“主页”页面(https://example.com/clinicianhttps://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");
}

关于此方案,我有几个问题:

  1. 这是一种合理的方法吗?
  2. 此方案([Authorize]属性和我的声明检查都依赖于查看cookie的值)。存储在该Cookie中的数据是否可以合理地防止篡改? (我希望如此,否则攻击者可以修改cookie并使用身份系统进行游戏。)

1 个答案:

答案 0 :(得分:0)

  

这是一种合理的方法吗?

是的,鉴于Identity cookie中包含所有声明,这是一种常见的方法。

  

该Cookie中存储的数据是否受到合理的篡改保护?

来自the docs

  

SignInAsync创建一个加密的cookie,并将其添加到当前   响应。如果不指定AuthenticationScheme,则默认   方案。

     

在幕后,使用的加密是ASP.NET Core的数据   保护系统。

您可以看到here,您可以对数据保护系统进行许多配置,包括使用证书创建/保护用于加密Identity cookie的密钥,以及使用临时密钥,以便所有cookie在关闭应用程序后会永远丢失。

总体而言,除非您需要较高的安全级别,否则默认设置已足够。