让我们假设我们有一个网站:
- 管理员部分
- 客户部分
- 来宾(访客(部分
显然,每个人都可以访问每个人的最后一个(访客部分(,而管理部门仅由管理和客户端部件 - 仅由注册客户端访问。管理员和客户端具有不同的模型类(Admin和用户相应地(存储在不同的数据库中,我们希望为每个数据库使用不同的身份验证cookie。是否可以使用ASP.NET核心身份?
我们尝试在附加定期初始化期间使用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");
. . . . . .
});
可能吗?是的。您需要创建自己的身份中间件来处理不同的cookie,但可以完成。
推荐?否
安全性有2个单独的问题:身份验证和授权。cookies可以很好地进行身份验证(某人是(,但是您应该使用授权角色和主张(某人可以做什么并且可以访问(,这就是您的'试图在这里解决。
ASP.NET的身份框架已经对这两个角色和主张都有很好的支持,因此您可以为每个人使用标准用户模型,为某些用户添加"管理员"角色,然后根据需要添加更具体的主张。p>处理授权的文档非常详细,并为您提供了精彩的选项演练。可以通过将其添加到用户配置文件,然后在您的控制器路由方法上使用[属性]来轻松执行这两个角色和主张,如下所示:
角色:
[Authorize(Roles = "Administrator")]
public class AdministrationAreaController : Controller
{
public IActionResult Index()
{
}
}
索赔:
[Authorize(Policy = "EmployeeOnly")]
public class ClientAreaController : Controller
{
public IActionResult Index()
{
}
}