C# ASP.NET核心标识中的两个身份验证cookie

C# ASP.NET核心标识中的两个身份验证cookie,c#,asp.net,cookies,asp.net-core,asp.net-identity,C#,Asp.net,Cookies,Asp.net Core,Asp.net Identity,假设我们有一个网站,其中有: 行政科 客户部门 访客组 显然,最后一个部分(Guest部分)每个人都可以访问,而管理部分(仅由管理部门访问)和客户部分(仅由注册客户访问)。 管理员和客户机具有不同的模型类(对应的管理员和用户),存储在不同的数据库中,我们希望为它们中的每一个使用不同的身份验证cookie。 是否可以使用ASP.NET核心标识 我们尝试在AddIdentity初始化期间使用CookieName属性,但似乎ApplicationCookie可在那里访问-是同一个对象,因此第二个定

假设我们有一个网站,其中有:

  • 行政科
  • 客户部门
  • 访客组
显然,最后一个部分(Guest部分)每个人都可以访问,而管理部分(仅由管理部门访问)和客户部分(仅由注册客户访问)。 管理员和客户机具有不同的模型类(对应的管理员和用户),存储在不同的数据库中,我们希望为它们中的每一个使用不同的身份验证cookie。 是否可以使用ASP.NET核心标识

我们尝试在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");
          .    .    .    .    .   .   
    });
服务
.AddIdentity(选项=>{
opts.Cookies.applicationcokie.CookieName=“客户端”;
opts.Cookies.applicationcokie.LoginPath=新路径字符串(“/login”);
.    .    .    .    .   .   
});
服务
.AddIdentity(选项=>{
//以下几行将cookie选项从客户端重写为管理员
opts.Cookies.applicationcokie.CookieName=“Admin”;
opts.Cookies.applicationcokie.LoginPath=新路径字符串(“/admin/login”);
.    .    .    .    .   .   
});

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

推荐

安全性有两个独立的问题:身份验证和授权。Cookie对于身份验证(某人是谁)很有效,但是您应该使用角色和声明进行授权(某人可以做什么和有权访问什么),这正是您试图解决的问题

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

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

角色:

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

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

每个角色不应该有一个标识,每个安全需求应该有一个角色。您很可能需要一个自定义标识存储库,在该存储库中,您可以根据某些逻辑决定是查询用户数据库还是管理数据库。您可以将它们存储在不同的数据库中,但从应用程序的角度来看,它们都是用户。我知道这不能回答你的问题,但我想说的是,也许你应该重新考虑你的设计。对我来说,听起来像是2(或3)个不同的应用程序。我们知道身份验证和授权以及授权的角色/声明方法之间的差异。这两个实体(用户和管理员)都有自己的角色列表,用于正确的授权行为。我们将它们存储在两个完全不同的位置(用户-在SQL DB中,管理员-在Azure表存储中)2.它们具有完全不同的属性集(除了名称和密码散列)。3.它更安全。如果黑客知道如何为某个用户添加一个额外的角色/声明,那么就不会发生什么可怕的事情。如果它们共享同一个存储—在某个帐户中添加“管理员”角色将允许此类黑客获得对系统的完全访问权。“用户”在本例中是应用程序的认证方,仅此而已。Cookie和identity与用户数据存储完全不同。不管是否有不同的数据库,您都可以使用自定义逻辑来检查正确的数据库,并且仍然使用相同的cookie空间登录它们。您还可以使用包含所有可能属性的通用
用户
模型或字典,然后使用角色(管理员或客户端)和声明(特定权限)的组合进行身份验证。这里没有安全好处。ASP.NET Identity已经通过对cookie凭据的正确加密进行了良好设计,因此不可能存在黑客攻击。即使发生了这种情况,任何人都可以很容易地更改cookie的名称,因此没有任何区别。安全问题与cookie无关。更重要的是访问数据库。例如,“用户”数据库可以存储在安全性较低的远程服务器上,“管理员”数据库存储在本地服务器上。如果有人访问“用户”数据库,他们仍然无法控制整个系统。无论如何,问题不在于系统架构。这是关于饼干的具体问题。