使用returnUrl对每个模块进行身份验证

本文关键字:身份验证 模块 returnUrl 使用 | 更新日期: 2023-09-27 18:16:47

我需要对某些模块和其他模块的无状态认证进行表单认证。使用Forms Authentication时,登录页面需要设置一个returnUrl .

我们已经在应用程序范围内的表单身份验证(为管道启用)中工作,但我们一直在尝试启用混合身份验证。

Per https://github.com/NancyFx/Nancy/issues/2439我们必须在模块构造函数中启用表单身份验证:

public abstract class FormsAuthenticationModuleBase : NancyModule
{
    protected FormsAuthenticationModuleBase(IUserMapper userMapper)
        : this(userMapper, string.Empty)
    {
    }
    protected FormsAuthenticationModuleBase(IUserMapper userMapper, string modulePath)
        : base(modulePath)
    {
        var formsAuthConfiguration = new FormsAuthenticationConfiguration
        {
            RequiresSSL = false,
            UserMapper = userMapper,
            RedirectUrl = "/login?returnUrl=" + Context.Request.Headers["X-Original-URL"].FirstOrDefault()
        };
        // Enable calls RequiresAuthentication.
        FormsAuthentication.Enable(this, formsAuthConfiguration);
    }
}

问题是Context在施工时是null

我们如何在每个模块的基础上启用表单身份验证并设置包含returnUrlRedirectUrl ?

(参见https://github.com/NancyFx/Nancy/wiki/Forms-authentication)

根据@khellang的建议,我尝试添加一个before钩子:

Before.AddItemToStartOfPipeline(
    ctx =>
    {
        if (!formsAuthConfiguration.RedirectUrl.Contains("?"))
        {
            formsAuthConfiguration.RedirectUrl +=
                "?returnUrl=" + ctx.Request.Headers["X-Original-URL"].FirstOrDefault();
        }
        return null;
    });

(附原RedirectUrl = "/login")

这将导致无法调试的405。(Before +=语法相同)

他还建议将所有内容移到钩子中,而不是存储配置并对其进行修改;

目前我在RequestStartup中使用if/else逻辑(与上述方法相反)。div。

在RequestStartup中使用if/else逻辑行得通

使用returnUrl对每个模块进行身份验证