Мне нужно иметь аутентификацию форм для некоторых модулей и безстоящую аутентификацию для других. С помощью проверки подлинности форм на странице входа необходимо установить returnUrl
.Для аутентификации на модуле с 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
, который включает в себя returnUrl
?
(Смотрите также https://github.com/NancyFx/Nancy/wiki/Forms-authentication)
Update
По совету @khellang я попытался добавив 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 (в отличие от вышеуказанного подхода). Это работает.