2013-08-04 13 views
8

Sto cercando di ottenere l'autenticazione sociale lavorando in un'app web Nancy ospitata da asp.net utilizzando lo WorldDomination SimpleAuthentication plugin for Nancy. TL; DRs salta alla domanda in grassetto nella parte inferiore della domanda.Come gestisco la mia autenticazione con WorldDomination e Nancy?

Entrambi sono abbastanza carini, ma c'è un ampio divario di documentazione tra il processo di autenticazione (ben coperto) e l'identificazione dell'utente autenticato durante richieste diverse dalla richiesta di autenticazione iniziale (nulla).

Nancy fornisce l'autenticazione di base e moduli tramite pacchetti aggiuntivi e i ganci forniti sono piuttosto semplici. WorldDomination non fornisce molte informazioni oltre l'effettivo processo di autenticazione. Sembra esserci una netta mancanza di Happy Path per il normale processo "chi è l'utente che effettua questa richiesta" che deve accadere ogni volta che un utente raggiunge il server.

Ho trascorso un bel po 'di tempo per capire questa parte, ma la mia ricerca non mi ha portato a nessuna soluzione ovvia. Le app demo WD sono prive di codice di richiesta diverso dalle richieste di autenticazione e il codebase non sembra contenere nulla che riguarda il normale ciclo di richieste.

La mia ipotesi migliore è che ho bisogno di integrarmi con le forme auth, implementando i ganci di autenticazione delle forme di Nancy e usando quello che torno da WD per popolare i miei tipi.

Questo non sembra esattamente il più felice dei percorsi felici. In effetti, sembra più un percorso "fai un sacco di lavoro, pigro bastardo".

Qual è, esattamente, il percorso consigliato per integrare i provider di autenticazione OAuth di WorldDomination e Nancy? Mi sto concentrando sullo standard "chi è questa persona che richiede da me" parte del ciclo di vita della pagina qui.

Punti bonus (dalle mie orde di account sockpuppet che creerò per lo scopo) per come questo felice percorso gestisce anche gli utenti che si disconnettono!

+1

@Phil, 'simple-authentication' sta per fare un nome tag generico orribile soggetto ad abuso da parte dell'eccentrico. Possiamo pensare ad un altro nome? Sfortunatamente, chiarirlo con il prefisso con 'nancy' rende troppo lungo un tag accettabile ... – Charles

+0

@Charles - :(È il nome della mia libreria. L'abbiamo chiamato WorldDomination.Web.Authentication ma abbiamo avuto troppe lamentele non era "impresa" e non potevano usarlo al lavoro – Phill

+0

@Phill: chiamalo * Semplice-Sociale *. Ha un bel suono ad esso. Stick "Authentico" su di esso per un po 'di sapore, e registra il .io Dominio: Instant venture capital – Will

risposta

15

Con Simple Authentication, gestiamo semplicemente l'autenticazione con un provider in modo semplice. Ogni fornitore ha implementazioni leggermente diverse, nomi diversi, promesse diverse, quindi possiamo consolidare tutto ciò in Simple Authentication e rendere più facile l'implementazione da parte di uno sviluppatore nel loro sito web.

Ecco perché esiste il pacchetto Nancy.SimpleAuthentication. Perché sappiamo come funziona Nancy abbiamo semplificato l'integrazione in Nancy con la creazione di moduli per voi per gestire il reindirizzamento, l'autenticazione di richiamata, ecc

Il problema è che noi semplicemente non sappiamo come si autenticare un utente contro il vostro sito web.

Siamo in grado di gestire autonomamente l'intero scenario delle forme, e in realtà pianifico di farlo in futuro. (Deve implementare reclami primi che io sono il 60% attraverso), ma sarà ancora al minimo indispensabile richiedere di implementare il 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); 
    } 
} 

Questa classe è necessaria per poter autenticare l'utente contro la vostra Banca dati.

La cosa che abbiamo pensato a questo è il 95% del tempo in cui l'utente inserisce l'autenticazione, molto probabilmente già ha già qualche forma di autenticazione. Solitamente Forms Auth.


Quindi supponendo che hai tirato in SimpleAuthentication e cablata vostra classe IAuthenticationCallbackProvider. Tutto quello che devi veramente fare è implementare la roba Auth dei moduli, che è praticamente una classe e una chiamata al metodo.

Nel provider è necessario chiamare il metodo LoginWithoutRedirect in modo che Nancy possa creare un cookie di autenticazione.

Quindi è necessario impostare la classe IUserMapper per indicare a Nancy come ottenere l'utente dal database. Se stai usando RavenDB questo sarebbe un aspetto simile:

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

configurato nel programma di avvio automatico come:

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

E questo è davvero ...

Io personalmente non credo che sia un sacco di codice che devi scrivere. Sia Nancy che Simple Authentication hanno svolto la maggior parte del lavoro sulle gambe per te :)

Spero di poter rendere SimpleAuthentication ancora più facile in futuro rimuovendo la necessità dell'autent di Forms, ma per ora penso che abbiamo un buon risultato soluzione.

link utili:

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/

Il secondo collegamento per World Domination, anche se c'è un po 'di ridenominazione, è per lo più la stessa. Ho intenzione di fare un post sul blog aggiornato e di rinnovare la wiki quando abbiamo cancellato le richieste.

Spero che questo ti aiuti.

Edit:

  • ho fatto appunto per creare un progetto più end-to-end demo.
+1

Wow, brb, crea orde di calzini. Grazie enormi. Questo praticamente risponde. – Will

+1

I collegamenti sono corretti –

+1

Grazie a @FrankSchwieterman ho risolto i collegamenti. – Phill

Problemi correlati