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

ASP.NET Core MVC中管理员与作者多登出功能异常排查

问题:ASP.NET Core MVC多认证方案下作者登出跳转异常

在N层架构的ASP.NET Core MVC项目中,为管理员(Admin)和作者(Writer)分别定义了AdminScheme和WriterScheme两个独立认证方案。管理员的登录、登出流程正常,但作者登录功能正常,执行登出操作后会跳转到管理员登录页面,而非预期的作者登录页面。已确认路由与控制器配置正确。

核心原因分析

  1. 全局授权策略默认绑定AdminScheme:全局授权规则未明确支持多认证方案,默认使用AdminScheme进行身份验证检查,导致登出后触发管理员登录页跳转。
  2. 作者面板控制器部分Action未指定专属授权方案:WriterPanelController中的多个Action未添加[Authorize(AuthenticationSchemes = "WriterScheme")]属性,触发默认的AdminScheme授权校验。
  3. 登出逻辑未完全隔离认证方案:登出时未明确指定仅清除WriterScheme的认证信息,且全局授权拦截了跳转逻辑。

解决方案

1. 修改全局授权策略,支持多认证方案

在Program.cs中,更新全局授权策略的构建逻辑,同时纳入AdminScheme和WriterScheme作为可接受的认证方案:

// Authorization Check
builder.Services.AddMvc(config =>
{
    // 同时支持AdminScheme和WriterScheme的认证
    var policy = new AuthorizationPolicyBuilder("AdminScheme", "WriterScheme")
        .RequireAuthenticatedUser()
        .Build();
    config.Filters.Add(new AuthorizeFilter(policy));
});

2. 完善作者面板控制器的授权属性

为WriterPanelController中所有需要授权的Action添加[Authorize(AuthenticationSchemes = "WriterScheme")]属性,确保仅使用WriterScheme进行身份校验:

public class WriterPanelController : Controller
{
    // ...原有依赖注入代码

    [Authorize(AuthenticationSchemes = "WriterScheme")]
    public IActionResult WriterProfile()
    {
        return View();
    }

    [Authorize(AuthenticationSchemes = "WriterScheme")]
    public IActionResult MyHeadings()
    {
        var values = headingManager.GetListByWriter();
        return View(values);
    }

    [Authorize(AuthenticationSchemes = "WriterScheme")]
    [HttpGet]
    public IActionResult NewHeading()
    {
        // ...原有代码
    }

    [Authorize(AuthenticationSchemes = "WriterScheme")]
    [HttpPost]
    public IActionResult NewHeading(Heading p)
    {
        // ...原有代码
    }

    [Authorize(AuthenticationSchemes = "WriterScheme")]
    [HttpGet]
    public IActionResult Update(int id)
    {
        // ...原有代码
    }

    [Authorize(AuthenticationSchemes = "WriterScheme")]
    [HttpPost]
    public IActionResult Update(Heading p)
    {
        // ...原有代码
    }

    [Authorize(AuthenticationSchemes = "WriterScheme")]
    public IActionResult Delete(int id)
    {
        // ...原有代码
    }
}

3. 优化作者登出逻辑,确保跳转正确

修改WriterPanelLoginController中的WriterLogOut方法,明确指定登出WriterScheme,并清除会话信息,避免全局授权拦截:

// Logout
public async Task<IActionResult> WriterLogOut()
{
    // 登出WriterScheme并指定跳转地址
    await HttpContext.SignOutAsync("WriterScheme", new AuthenticationProperties
    {
        RedirectUri = Url.Action("WriterLogin", "WriterPanelLogin")
    });
    // 清除当前会话
    HttpContext.Session.Clear();
    return RedirectToAction("WriterLogin", "WriterPanelLogin");
}

同时,在Program.cs的WriterScheme配置中移除options.LogoutPath设置,避免与自定义登出逻辑冲突:

.AddCookie("WriterScheme", options =>
{
    options.LoginPath = "/WriterPanelLogin/WriterLogin";
    options.AccessDeniedPath = "/WriterPanelLogin/WriterLogin";
    options.Cookie.Name = "WriterScheme";
    // 移除该行:options.LogoutPath = "/WriterPanelLogin/WriterLogOut";
});

4. 验证默认路由的公开访问权限

默认路由指向Category控制器的IndexAction,如果该页面是公开页面,需为CategoryController添加[AllowAnonymous]属性,避免登出后触发授权检查:

[AllowAnonymous]
public class CategoryController : Controller
{
    // ...原有代码
}

内容的提问来源于stack exchange,提问作者codAction

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 02:42:33