2012-04-17 20 views
5

Sto tentando di seguire l'esempio Nancy.Demo.Authentication.Forms ma sto riscontrando problemi poiché sembra che il codice di esempio non sia aggiornato. Mi dispiace se questa domanda è lunga ma non voglio perdere i miei errori. Quindi, ecco quello che ho fatto finora:Nancy: FormsAuthentication - Getting Started

Ho installato con successo il pacchetto di autenticazione tramite la console di gestione dei pacchetti (VS11 beta)

PM> install-package nancy.Authentication.Forms 
Attempting to resolve dependency 'Nancy (= 0.10.0)'. 
Successfully installed 'Nancy.Authentication.Forms 0.10.0'. 
Successfully added 'Nancy.Authentication.Forms 0.10.0' to uMentor. 

ho scritto un'implementazione di IUserMapper che prende una dipendenza da mia sessione RavenDB fornitore e lo utilizza per trovare e convalidare gli utenti

public class FormsAuthenticationService : IUserMapper 
{ 
    private readonly IRavenSessionProvider _ravenSessionProvider; 

    public FormsAuthenticationService(IRavenSessionProvider ravenSessionProvider) 
    { 
     _ravenSessionProvider = ravenSessionProvider; 
    } 

    public IUserIdentity GetUserFromIdentifier(Guid identifier) 
    { 
     using (var ravenDB = _ravenSessionProvider.GetSession()) 
     { 
      var user = ravenDB.Query<User>().FirstOrDefault(u => u.FormsAuthenticationGuid == identifier); 
      return user; 
     } 
    } 

    public static Guid? ValidateUser(IDocumentSession ravenDB, string username, string password) 
    { 
     var user = ravenDB.Query<User>().FirstOrDefault(u => u.UserName == username && u.Password == password); 
     if (user == null) 
     { 
      return null; 
     } 
     return user.FormsAuthenticationGuid; 
    } 
} 

ho aggiunto una proprietà da mia classe utente per soddisfare il campo identificatore Guid necessario per rendere il cookie più sicura (ho letto tutti i messaggi di grumpydev e capire perché th è GUID è necessario, ma è una buona pratica per rendere questo un campo di proprietà sulla classe User?)

public class User : IUserIdentity 
{ 
    public string UserName { get; set; } 
    public IEnumerable<string> Claims { get; set; } 
    public string Email { get; set; } 
    public string Password { get; set; } 
    public Guid FormsAuthenticationGuid { get; set; } 
} 

Finalmente ho aggiunto più di impostazione alla mia bootstrapper rubando il codice direttamente dalla demo (link qui sopra). Questo è dove sto avendo problemi. Il codice sembra essere cambiato.

public class MyBootstrapper : DefaultNancyBootstrapper 
{ 
    protected override void ConfigureRequestContainer(TinyIoCContainer container, NancyContext context) 
    { 
     base.ConfigureRequestContainer(container, context); 
     container.Register<IUserMapper, FormsAuthenticationService>(); 
    } 

    protected override void RequestStartup(TinyIoCContainer requestContainer, IPipelines pipelines, NancyContext context) 
    { 
     var formsAuthConfiguration = 
      new FormsAuthenticationConfiguration() 
      { 
       //These properties do not exist! <<---- Edit - yes they do - see comment 
       RedirectUrl = "~/login", 
       UserMapper = requestContainer.Resolve<IUserMapper>(), 
      }; 
     //This method does not exist <<---- Edit - yes they do - see comment 
     FormsAuthentication.Enable(pipelines, formsAuthConfiguration); 
    } 

    protected override NancyInternalConfiguration InternalConfiguration 
    { 
     get { return NancyInternalConfiguration.WithOverrides(x => x.NancyModuleBuilder = typeof(RavenAwareModuleBuilder)); } 
    } 
} 

EDIT 1 Si scopre il mio errore è stato stupido (un using dichiarazione non corretta - vedi commenti qui sotto). Tutto il codice sopra ora funziona bene quindi lascerò questa domanda in piedi.

+0

Gotcha! OK, ho trovato il problema con il codice rotto. Il resharper contiene utilmente la seguente istruzione using: 'using FormsAuthenticationConfiguration = System.Web.Configuration.FormsAuthenticationConfiguration;'. Rimozione di questo risolto il codice rotto :-) Tuttavia, sarei comunque lieto di ricevere commenti sulla mia implementazione. Ho bisogno di essere rassicurato sul fatto che sono sulla strada giusta. Grazie. – biofractal

+0

My Nancy FormsAuthentication with RavenDB ora funziona tutto. Anche se sono andato in giro per le case solo per potermi mordere la coda, ho intenzione di lasciare questa domanda in piedi perché potrebbe aiutare gli altri. – biofractal

risposta

1

Solo nel caso vi siete persi il commento di cui sopra, la risposta era pateticamente semplice:

Gotcha! OK, ho trovato il problema con il codice rotto. Il resharper utilizza utilmente la seguente istruzione using: 'using FormsAuthenticationConfiguration = System.Web.Configuration.FormsAuthenticationConfiguration;'. Rimozione questo ha risolto il codice non funzionante :-) Tuttavia, sarei comunque soddisfatto dei commenti sulla mia implementazione. Ho bisogno di essere rassicurato sul fatto che sono sulla strada giusta .