You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在.NET Core 8中为两个区域设置Cookie并实现权限控制

实现双Area独立Cookie与访问限制方案

1. 配置双Cookie认证方案

在Program.cs的服务配置阶段,添加两个独立的Cookie认证方案,分别对应管理员和普通用户,通过Cookie名称区分会话:

builder.Services.AddAuthentication()
.AddCookie("AdminAuth", options =>
{
    options.Cookie.Name = "AdminSession";
    options.LoginPath = "/Admin/Login/Index";
    options.AccessDeniedPath = "/Admin/Login/AccessDenied";
    options.ExpireTimeSpan = TimeSpan.FromHours(8);
})
.AddCookie("CustomerAuth", options =>
{
    options.Cookie.Name = "CustomerSession";
    options.LoginPath = "/Customer/Login/Index";
    options.AccessDeniedPath = "/Customer/Login/AccessDenied";
    options.ExpireTimeSpan = TimeSpan.FromHours(24);
});

2. 绑定授权策略与认证方案

为两个区域创建专属授权策略,确保只有对应认证方式的登录用户才能访问:

builder.Services.AddAuthorization(options =>
{
    options.AddPolicy("AdminPolicy", policy =>
    {
        policy.AuthenticationSchemes.Add("AdminAuth");
        policy.RequireAuthenticatedUser();
        // 可额外添加角色验证:policy.RequireRole("Admin");
    });

    options.AddPolicy("CustomerPolicy", policy =>
    {
        policy.AuthenticationSchemes.Add("CustomerAuth");
        policy.RequireAuthenticatedUser();
        // 可额外添加角色验证:policy.RequireRole("Customer");
    });
});

3. 为Area控制器添加授权标记

管理员区域(Admin)

除登录控制器外,其余控制器添加管理员授权策略:

[Area("Admin")]
[Authorize(Policy = "AdminPolicy")]
public class HomeController : Controller
{
    // 管理员面板业务逻辑
}

// 登录控制器无需授权
[Area("Admin")]
public class LoginController : Controller
{
    public IActionResult Index() => View();

    [HttpPost]
    public async Task<IActionResult> Login(LoginViewModel model)
    {
        // 管理员账号验证逻辑...
        
        // 使用AdminAuth方案创建登录Cookie
        var claims = new List<Claim>
        {
            new Claim(ClaimTypes.Name, model.Username),
            new Claim(ClaimTypes.Role, "Admin")
        };
        var identity = new ClaimsIdentity(claims, "AdminAuth");
        await HttpContext.SignInAsync("AdminAuth", new ClaimsPrincipal(identity));

        return RedirectToAction("Index", "Home");
    }

    public async Task<IActionResult> Logout()
    {
        await HttpContext.SignOutAsync("AdminAuth");
        return RedirectToAction("Index");
    }
}

普通用户区域(Customer)

同理,除登录控制器外,其余控制器添加用户授权策略:

[Area("Customer")]
[Authorize(Policy = "CustomerPolicy")]
public class HomeController : Controller
{
    // 用户网站业务逻辑
}

// 登录控制器无需授权
[Area("Customer")]
public class LoginController : Controller
{
    public IActionResult Index() => View();

    [HttpPost]
    public async Task<IActionResult> Login(LoginViewModel model)
    {
        // 普通用户账号验证逻辑...
        
        // 使用CustomerAuth方案创建登录Cookie
        var claims = new List<Claim>
        {
            new Claim(ClaimTypes.Name, model.Username),
            new Claim(ClaimTypes.Role, "Customer")
        };
        var identity = new ClaimsIdentity(claims, "CustomerAuth");
        await HttpContext.SignInAsync("CustomerAuth", new ClaimsPrincipal(identity));

        return RedirectToAction("Index", "Home");
    }

    public async Task<IActionResult> Logout()
    {
        await HttpContext.SignOutAsync("CustomerAuth");
        return RedirectToAction("Index");
    }
}

4. 启用认证授权中间件

在Program.cs的管道配置中,确保认证、授权中间件顺序正确(置于路由配置之前):

app.UseAuthentication();
app.UseAuthorization();

// 保留原有路由配置
app.MapAreaControllerRoute(
    name: "Admin",
    areaName: "Admin",
    pattern: "Admin/{controller=Login}/{action=Index}/{id?}");

app.MapAreaControllerRoute(
    name: "Customer",
    areaName: "Customer",
    pattern: "Customer/{controller=Home}/{action=Index}/{id?}");

app.MapControllerRoute(
    name: "default",
    pattern: "{controller=Home}/{action=Index}/{id?}");

5. 默认路由访问限制(可选)

若默认路由(非Area控制器)也需禁止未授权访问,可给对应控制器添加授权标记:

[Authorize(Policy = "CustomerPolicy")]
public class HomeController : Controller
{
    // 默认首页逻辑
}

内容的提问来源于stack exchange,提问作者Hassan Moradi Fard

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 00:05:14