【问题标题】:Two authentication cookies in ASP.NET Core IdentityASP.NET Core Identity 中的两个身份验证 cookie
【发布时间】:2017-10-29 23:13:49
【问题描述】:

假设我们有一个网站:

  • 管理部分
  • 客户部分
  • 客人(访客)部分

显然,每个人都可以访问最后一个(访客部分),而管理部分 - 仅由管理部门和客户部分 - 仅由注册客户访问。 管理员和客户端具有不同的模型类(对应的 Admin 和 User),存储在不同的数据库中,我们希望为它们中的每一个使用不同的身份验证 cookie。 是否可以使用 ASP.NET Core Identity?

我们尝试在 AddIdentity 初始化期间使用 CookieName 属性,但似乎可以在那里访问 ApplicationCookie - 是同一个对象,因此第二个定义只是重写了第一个:

services
    .AddIdentity<User, UserRole>(opts => {
        opts.Cookies.ApplicationCookie.CookieName = "Client";
        opts.Cookies.ApplicationCookie.LoginPath = new PathString("/login");
          .    .    .    .    .   .   

    });



services
    .AddIdentity<Admin, AdminRole>(opts => {
        //the following lines rewrite cookie options from client's to admin's
        opts.Cookies.ApplicationCookie.CookieName = "Admin";
        opts.Cookies.ApplicationCookie.LoginPath = new PathString("/admin/login");
          .    .    .    .    .   .   
    });

【问题讨论】:

  • 您不应该为每个角色拥有一个身份,您应该为每个安全需求拥有一个角色。您很可能需要一个自定义 IdentityStore,您可以在其中根据某些逻辑决定是查询 User 还是 Admin db
  • 嗯,你可能将它们存储在不同的数据库中,但从应用程序的角度来看,它们都是用户。我知道这并不能回答你的问题,但我想说的是,也许你应该重新考虑你的设计。
  • 对我来说听起来像是 2 个(或 3 个)不同的应用程序。

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


【解决方案1】:

可能吗?是的。您需要创建自己的身份中间件来处理不同的 cookie,但可以做到。

推荐? 没有

安全性有两个不同的问题:身份验证和授权。 Cookie 可以很好地用于身份验证(某人是谁),但是您应该使用角色和声明进行授权(某人可以做什么和有权访问),这就是您的在这里尝试解决。

ASP.NET 的身份框架已经对角色和声明提供了很好的支持,因此您可以为每个人使用标准用户模型,为某些用户添加“管理员”角色,然后根据需要添加更具体的声明。

用于处理授权的documentation 非常详细,并为您提供了一个很好的选项演练。角色和声明都可以通过将它们添加到用户配置文件然后在控制器路由方法上使用 [Attributes] 来轻松实施,如下所示:

角色:

[Authorize(Roles = "Administrator")]
public class AdministrationAreaController : Controller
{
    public IActionResult Index()
    {
    }
}

声明:

[Authorize(Policy = "EmployeeOnly")]
public class ClientAreaController : Controller
{
    public IActionResult Index()
    {
    }
}

【讨论】:

  • 我们知道身份验证和授权之间的区别以及用于授权的角色/声明方法。这两个实体(用户和管理员)都有自己的角色列表,用于正确的授权行为。
  • 我们需要划分用户和管理员的原因是:1.我们将它们存储在两个完全不同的地方(用户-在SQL DB中,管理员-在Azure表存储中)2.它们完全不同一组属性(可能除了名称和密码哈希)。 3.更安全。如果黑客知道如何为某些用户添加额外的角色/声明 - 不会发生任何可怕的事情。如果他们共享相同的存储 - 向某个帐户添加“管理员”角色将允许此类黑客获得对系统的完全访问权限。
  • “用户”在这种情况下是您的应用程序的认证方,仅此而已。 Cookie 和身份与用户数据存储完全不同。是否有不同的数据库无关紧要,您可以使用自定义逻辑来检查正确的数据库并仍然使用相同的 cookie 空间登录它们。您还可以使用包含所有可能属性的通用 User 模型或 Dictionary,然后使用角色(管理员或客户端)和声明(特定权限)的组合进行身份验证。
  • 这里没有安全优势。 ASP.NET Identity 已经经过精心设计,对 cookie 凭据进行了适当的加密,因此不可能进行黑客攻击。即使确实发生了这种情况,任何人都可以轻松更改 cookie 的名称,因此没有区别。
  • 安全问题与cookies无关。它更多地是关于访问数据库。例如,“用户”数据库可以存储在一些安全性较低的远程服务器上,而“管理员”数据库存储在本地服务器上。如果有人可以访问“用户”数据库,他们仍然无法控制整个系统。无论如何,问题不在于系统架构。这是关于 cookie 的具体问题。
猜你喜欢
  • 2018-12-30
  • 2017-03-30
  • 2018-05-10
  • 2018-07-06
  • 1970-01-01
  • 2018-09-02
  • 2022-01-23
  • 1970-01-01
  • 2018-02-24
相关资源
最近更新 更多