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.
@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
@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
@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