2016-11-07 2 views
1

Мне нужно иметь аутентификацию форм для некоторых модулей и безстоящую аутентификацию для других. С помощью проверки подлинности форм на странице входа необходимо установить 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 (в отличие от вышеуказанного подхода). Это работает.

ответ

Смежные вопросы