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

时间:2016-11-07 22:50:53

标签: c# authentication nancy

我需要为某些模块进行表单身份验证,为其他模块进行无状态身份验证。使用表单身份验证,登录页面需要设置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

我们如何在每个模块的基础上启用表单身份验证,并设置包含RedirectUrl的{​​{1}}?

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

更新

根据@khellang的建议,我尝试添加before hook

returnUrl

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

这导致405我无法调试。 (RedirectUrl = "/login"语法相同。)

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

目前我正在使用if/else logic in RequestStartup(与上述方法相反)。这很有效。

1 个答案:

答案 0 :(得分:0)