2017-05-29 158 views
1

让我们假设我们有一个网站,其中有:两个身份验证cookie

  • 管理部分
  • 客户端部分
  • 游客(游客)部分

显然,最后一个(访客部分)可以由所有人访问,而管理员部分 - 仅由管理员和客户端部分 - 只能由注册客户访问。 管理员和客户端有不同的模型类(相应的管理员和用户),存储在不同的数据库中,我们希望为他们每个人使用不同的身份验证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"); 
      . . . . . . 
    }); 
+2

你不应该为每个角色拥有一个身份,你应该为每个安全需求设置一个角色。您很可能需要一个自定义IdentityStore,您可以根据某些逻辑决定是否查询User或Admin db。 –

+0

您可以将它们存储在不同的数据库中,但从应用程序的角度来看,它们都是USERS。我知道这并不回答你的问题,但我想说的是,也许你应该重新考虑你的设计。 – JuanR

+0

听起来像2(或3)不同的应用程序给我。 – Mike

回答

2

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

推荐?

有两个单独的安全问题:认证和授权。 Cookie可以很好地进行身份验证(某人是),但您应该使用角色和声明进行授权(某人可以做什么并且有权访问),这正是您要在此处解决的问题。

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

用于处理授权的documentation非常详细,并为您提供了很好的选项演练。两个角色和权利要求可以很容易地将它们添加到用户简档,然后使用您的控制器路线方法[属性]强制执行,如下图所示:

角色:

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

要求:

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

我们意识到身份验证和授权与授权的角色/声明方法之间的区别。 这两个实体(用户和管理员)都有自己的适当授权行为的角色列表。 – Sergiy

+0

我们需要划分用户和管理员的原因是: 1。我们将它们存储在两个完全不同的位置(用户 - 在SQL DB中,管理员 - 在Azure表存储中) 2.他们具有完全不同的属性集(可能名称和密码哈希除外)。 3.更安全。如果黑客了解如何向某个用户添加额外的角色/声明 - 没有什么可怕的事情发生。如果他们被共享相同的存储 - 为某个帐户添加“管理员”角色将允许这样的黑客完全访问系统。 – Sergiy

+1

在这种情况下,“用户”是您的应用程序的认证方,仅此而已。 Cookie和身份与用户数据存储完全不同。不管是否有不同的数据库,都可以使用自定义逻辑来检查正确的数据库并仍然使用相同的cookie空间登录它们。您还可以使用包含所有可能属性或Dictionary <>的通用'User'模型,然后使用角色(管理员或客户端)和声明(特定权限)的组合来进行身份验证。 –