2016-07-19 48 views
20

Sto esplorando la classe SignInManager. Ma le informazioni fornite su MSDN sono molto inutili. Indica solo quali sono i metodi e le proprietà forniti.SignInManager, che cos'è e come, quando usarlo?

Quello che sto cercando è,

1) Qual è SignInManager? 2) Come si usa? 3) E ho il mio database che contiene informazioni relative alle credenziali (nome utente e password)

Come posso utilizzare SignInmanager e come utilizzarlo in modo che il mio database personalizzato sia utilizzato per autenticare gli utenti?

Sto usando asp.net MVC 5 e Visual Studio 2015. Nel mio progetto di esempio ho controller di account che contiene i metodi d'azione come

public async Task<ActionResult> ExternalLoginCallback(string returnUrl) 

Ma non ho idea di come usarlo, MSDN è completamente inutile fornire informazioni su questo. Qualsiasi link utile che lo spiega nei dettagli perché non ho idea di cosa sia SignInManager e a cosa serve.

Grazie

risposta

28

Disclaimer: io sono confuso dal modello utilizzato in ASP.NET identità me stesso e quello che dico è la mia comprensione delle cose, che possono essere imprecise (potrei anche essere affermando cose ovvie, quindi mi scuso) . Inoltre, recentemente stavo giocando con l'identità di Asp.Net Core che è leggermente diversa rispetto a quella disponibile per Asp.Net 4, quindi potrei mescolare le cose.

Cookies

ASP.NET identità opera con due tipi di cookie: Applicazione biscotto e biscotto esterna. Il cookie dell'applicazione contiene l'identità della tua applicazione ed è emesso dal gestore di accesso. Il cookie esterno contiene l'identità del provider di autenticazione esterna e viene emesso dal middleware di autenticazione (ad esempio FacebookAuthenticationMiddleware, ad esempio). L'utente utilizza il gestore di accesso per utilizzare il cookie esterno e emettere invece il cookie dell'applicazione. Se non si utilizza l'autenticazione esterna non si gestiscono cookie esterni.

Accedi direttore

classe dichiarata come questo:

public class SignInManager<TUser, TKey> : IDisposable 
    where TUser : class, IUser<TKey> 
    where TKey : IEquatable<TKey> 

così si può utilizzare qualsiasi classe come utente fintanto che implementa l'interfaccia IUser<TKey>. O utilizzare IdentityUser come base se si inizia da zero, che implementa IUser<string>. In passato ho tentato di creare un'implementazione che utilizza come TKey, ma ho abbandonato il tentativo dopo aver trascorso un po 'di tempo a cercare di farlo funzionare e di non vedere alcun progresso.

Password Entra

SignInManager.SignInAsync questioni di metodo di applicazione dei cookie per l'utente specificato subito senza alcun controllo, quindi se si sceglie di implementare qualsiasi logica di autenticazione personalizzati, si potrebbe desiderare di usarlo (default asp.net modello MVC usa dopo aver registrato l'utente in modo che non debbano autenticarsi subito dopo la registrazione).

SignInManager.PasswordSignInAsync dato il nome utente e la password controlla la loro validità e rilascia i cookie dell'applicazione se sono corretti.

segno esterno in

Invece di dover all'utente di creare login e password per il sito specifico si potrebbe desiderare loro di utilizzare qualche sito web esterno per autenticare e passare le informazioni di autenticazione a voi con OAuth.

Asp.Net Identità ha nozione di User e Login, dove User è ... beh, l'utente (una persona), e Login è la credenziale con cui User autentica. User potrebbe avere più Login s.

flusso OAuth come si vede dal sito Web Asp.Net assomiglia a questo (sulla base del registro predefinito nel flusso generato dal modello VS):

  1. di impostare i provider di autenticazione esterni (autenticazione middleware), che si è disposti ad accettare (che probabilmente comporta la registrazione su un sito Web esterno. Ad esempio, per utilizzare l'autenticazione di Facebook è necessario creare l'app Facebook, impostare l'URL di ritorno lì per puntare al proprio sito Web e configurare FacebookAuthenticationMiddleware con l'ID app e il segreto dell'app Facebook ti fornisce).
  2. Si presenta all'utente non autenticato con una scelta di provider esterni supportati.
  3. utente sceglie un fornitore, la scelta viene inviato l'applicazione web Asp.Net
  4. applicazione Web rilascia un ChallengeResult contenente il nome del provider da utilizzare (questo di solito accade in AccountController.ExternalLogin), URL di ritorno è impostato per chiamare AccountController.ExternalLoginCallback e l'URL di ritorno effettivo dell'utente dovrebbe finire per essere salvato per dopo.
  5. Il middleware appropriato cattura l'oggetto ChallengeResult e lo converte in una risposta di reindirizzamento HTTP che fa sì che il browser dell'utente si rechi sul sito Web di terzi che richiede all'utente le credenziali.
  6. Il sito Web di terze parti dopo l'autenticazione riuscita reindirizza l'utente al sito Web dell'utente verso l'URL specifico creato dal middleware di autenticazione (per Facebook è /signin-facebook IIRC).
  7. Il middleware di autenticazione intercetta questa chiamata, convalida i dati trasmessi dal sito Web di terze parti e se tutto OK emette il cookie esterno e reindirizza a qualsiasi cosa è stata impostata come URL di ritorno al passaggio 4 (che dovrebbe essere AccountController.ExternalLoginCallback).
  8. In AccountController.ExternalLoginCallback è necessario consumare il cookie esterno ed emettere invece un cookie dell'applicazione. Questo è ciò che fa SignInManager.ExternalSignInAsync: date le informazioni di accesso tenta di trovare l'utente con quello Login. Se trova, emette un cookie dell'applicazione; se non lo fa, ti informa e dovresti fare quello che pensi sia giusto quando ricevi sconosciuto Login (generalmente, a questo punto crei un nuovo utente. L'implementazione predefinita dal modello VS richiede ulteriori informazioni a questo punto e crea l'utente in AccountController.ExternalLoginConfirmation). Dopo che l'utente viene reindirizzato alla URL rendimento effettivo "salvato per dopo" al punto 4.

archiviazione personalizzato

Sono stato infruttuoso finora con la creazione di storage personalizzata per Asp.Net Identità. In genere comporta l'implementazione della propria classe User Manager decrescente la classe di memoria UserManager<TUser, TKey> e l'implementazione di serie di interfacce come IUserStore<TUser, TKey>, IUserRoleStore<TUser, TKey>, ecc.

+0

Risposta molto buona.Riguardo al punto 8 in accesso esterno, devo usare anche signinmanager in web api? –

+0

'SignInManager' è una classe helper che si occupa di cookie per applicazioni esterne, convalida della password e 2FA. Non sei sicuro di quale di questi sia utile per le API Web. – n0rd

+1

Molto chiaro e utile. Anche l'ovvio ha spesso bisogno di essere presentato chiaramente! Grazie! –

Problemi correlati