2012-04-17 14 views
5

Estoy tratando de seguir el ejemplo Nancy.Demo.Authentication.Forms pero estoy teniendo problemas ya que parece que el código de ejemplo no está actualizado. Lo siento si esta pregunta es larga, pero no quiero perder mis errores. Así que aquí es lo que he hecho hasta ahora:Nancy: FormsAuthentication - Comenzando

He instalado con éxito el paquete de autenticación a través de la consola de administrador de paquetes (beta VS11)

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. 

escribí una implementación de IUserMapper que tiene una dependencia en mi sesión RavenDB proveedor y la usa para encontrar y validar a los usuarios mensajes de grumpydev

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; 
    } 
} 

he añadido una propiedad a mi clase de usuario para atender el campo identificador GUID requerida para hacer la cookie más seguro (he leído y entendido por qué º Se GUID es necesario, pero es una buena práctica para hacer de este un campo propiedad de la clase de usuario?)

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; } 
} 

Por último, me han añadido más de configuración para mi programa previo al robar el código directamente de la demostración (enlace de arriba) Aquí es donde estoy teniendo problemas. El código parece haber cambiado.

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 Resulta que mi error fue tonto (una afirmación incorrecta using - ver comentarios más abajo). Todo el código anterior funciona bien, así que dejo esta pregunta en pie.

+0

Gotcha! OK, encontré el problema con el código roto. Resharper puso amablemente en la siguiente instrucción using: 'using FormsAuthenticationConfiguration = System.Web.Configuration.FormsAuthenticationConfiguration;'. Eliminar esto resolvió el código roto :-) Sin embargo, todavía recibiría con agrado cualquier comentario sobre mi implementación. Necesito estar seguro de que estoy en el camino correcto. Gracias. – biofractal

+0

Mi Nancy FormsAuthentication con RavenDB ahora todo funciona. Aunque recorrí las casas solo para morder mi propia cola, voy a dejar esta pregunta en pie porque puede ayudar a otros. – biofractal

Respuesta

1

Sólo en caso de que se perdió el comentario anterior, la respuesta fue patéticamente simple:

Gotcha! OK, encontré el problema con el código roto. Resharper útil poner en la siguiente instrucción de uso: 'using FormsAuthenticationConfiguration = System.Web.Configuration.FormsAuthenticationConfiguration;'. Al eliminar , se solucionó el código roto :-) Sin embargo, aún así recibiría con agrado cualquier comentario sobre mi implementación. Necesito garantías de que estoy en el camino correcto .