使用 returnUrl 的每个模块身份验证

Per module authentication with returnUrl

我需要对某些模块进行表单身份验证,对其他模块进行无状态身份验证。使用 Forms Authentication,登录页面需要设置 returnUrl.

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

根据 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 I tried adding a before hook 的建议:

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

        return null;
    });

(同原RedirectUrl = "/login")

这导致我无法调试到 405。 (与 Before += 语法相同。)

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

目前我正在使用 if/else logic in RequestStartup(与上述方法相反)。行得通。

使用 if/else logic in RequestStartup 有效。