oauth forms-authentication nancy simple-authentication

oauth - ¿Cómo administro mi autenticación con WorldDomination y Nancy?



forms-authentication simple-authentication (1)

Con Simple Authentication, simplemente manejamos la autenticación con un proveedor de una manera simple. Cada proveedor tiene implementaciones ligeramente diferentes, nombres diferentes, promesas diferentes, por lo que podemos consolidar todo eso en Autenticación simple y facilitar que un desarrollador implemente en su sitio web.

Es por eso que existe el paquete Nancy.SimpleAuthentication. Como sabemos cómo funciona Nancy, hemos simplificado la integración en Nancy al crear los módulos para que pueda gestionar la redirección, la devolución de llamada de autenticación, etc.

El problema es que simplemente no sabemos cómo autenticas a un usuario contra tu sitio web .

Podemos manejar todo el escenario auth de formularios nosotros mismos, y de hecho lo planearé en el futuro. (Tengo que implementar reclamos primero, a través de los cuales estoy al 60%), pero todavía requerirá implementar el IAuthenticationCallbackProvider

public class Test : IAuthenticationCallbackProvider { public dynamic Process( NancyModule nancyModule, AuthenticateCallbackData model) { //Query for the database user based on the Provider / Id //Authenticate the user //Call LoginWithoutRedirect, and redirect how you want... // or LoginWithRedirect return nancyModule.Negotiate.WithView("AuthenticateCallback") .WithModel(model); } }

Esta clase es necesaria para que pueda autenticar al usuario contra su base de datos.

Lo que pensamos es que el 95% del tiempo que el usuario realiza la autenticación, probablemente ya tenga algún tipo de autenticación. Por lo general, formas de autenticación

Entonces, suponiendo que haya ingresado SimpleAuthentication y conectado su clase IAuthenticationCallbackProvider . Todo lo que necesitas hacer es implementar las cosas de autenticación de formularios, que son más o menos una clase, y una llamada a un método.

En el proveedor, debe llamar al método LoginWithoutRedirect para que Nancy pueda crear una cookie de autenticación.

Luego debe configurar la clase IUserMapper para decirle a Nancy cómo obtener al usuario de la base de datos. Si usas RavenDB, esto se vería así:

public class DatabaseUser : IUserMapper { public IDocumentStore DocumentStore { get; set; } public DatabaseUser(IDocumentStore documentStore) { DocumentStore = documentStore; } public IUserIdentity GetUserFromIdentifier( Guid identifier, NancyContext context) { using (var session = DocumentStore.OpenSession()) { var member = session.Query<Member>() .SingleOrDefault(x => x.Identifier == identifier); if (member == null) return null; return new UserIdentity { UserName = member.DisplayName, Claims = new [] { "NewUser", "CanComment" } }; } } }

Configurado en el bootstrapper como:

protected override void ConfigureRequestContainer( TinyIoCContainer container, NancyContext context) { base.ConfigureRequestContainer(container, context); container.Register<IUserMapper, DatabaseUser>(); } protected override void RequestStartup( TinyIoCContainer container, IPipelines pipelines, NancyContext context) { base.RequestStartup(container, pipelines, context); var formsAuthConfiguration = new FormsAuthenticationConfiguration { RedirectUrl = "~/login", UserMapper = container.Resolve<IUserMapper>(), }; FormsAuthentication.Enable(pipelines, formsAuthConfiguration); }

Y eso es realmente ...

Personalmente, no creo que haya que escribir mucho código. Tanto Nancy como Simple Authentication han hecho la mayor parte del trabajo para ti :)

Espero que podamos simplificar aún más la SimpleAuthentication en el futuro al eliminar la necesidad de Forms Auth, pero por ahora creo que tenemos una solución bastante buena.

Enlaces Útiles:

http://www.philliphaydon.com/2012/12/18/forms-authentication-with-nancyfx/

http://www.philliphaydon.com/2013/01/31/oauth-with-nancyfx-and-world-domination-authentication/

El segundo enlace para World Domination, aunque hay un poco de cambio de nombre, es casi lo mismo. Planeo hacer una publicación de blog actualizada y renovar la wiki cuando hemos pulido las Reclamaciones.

Espero que eso te ayude.

Editar:

  • He tomado nota para crear un proyecto de demostración de solución más integral.

Estoy intentando que la autenticación social funcione en una aplicación web Nancy alojada en asp.net utilizando el complemento WorldDomination SimpleAuthentication para Nancy . TL; DR salte a la pregunta en negrita en la parte inferior de la pregunta.

Ambos son muy buenos, pero hay una gran brecha de documentación entre el proceso de autenticación (bien cubierto) e identificar al usuario autenticado durante las solicitudes que no sean la solicitud de autenticación inicial (nada).

Nancy proporciona autenticación básica y de formas a través de paquetes adicionales, y los enlaces que proporcionan son bastante sencillos. WorldDomination no proporciona mucha información después del proceso de autenticación real. Parece que hay una clara falta de Happy Path para el proceso normal de "quién es el usuario que realiza esta solicitud" que tiene que suceder cada vez que un usuario golpea el servidor.

He estado gastando una buena cantidad de tiempo para resolver esta parte, pero mi investigación no me ha llevado a ninguna solución obvia. Las aplicaciones de demostración de WD carecen de código de solicitud que no sean solicitudes de autenticación, y la base de código no parece contener nada relacionado con el ciclo de solicitud normal.

Mi mejor opción es que necesito integrarme con auth de formularios, implementar los auth hooks de formas de Nancy y usar lo que obtengo de WD para poblar mis propios tipos.

Esto no parece exactamente el más feliz de los caminos felices. De hecho, parece ser más un camino de "haz mucho trabajo, bastardo perezoso".

¿Cuál es exactamente el camino feliz recomendado para integrar a los proveedores de autenticación social OAuth de WorldDomination y a Nancy? Me estoy concentrando aquí en el ciclo de vida de la página estándar "¿Quién es esta persona que me solicita?".

Puntos de bonificación (de mis hordas de cuentas de sockpuppet que crearé para el propósito) de cómo este feliz camino maneja a los usuarios que también se desconectan.