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):
- 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).
- Si presenta all'utente non autenticato con una scelta di provider esterni supportati.
- utente sceglie un fornitore, la scelta viene inviato l'applicazione web Asp.Net
- 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.
- 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.
- 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).
- 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
).
- 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.
Risposta molto buona.Riguardo al punto 8 in accesso esterno, devo usare anche signinmanager in web api? –
'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
Molto chiaro e utile. Anche l'ovvio ha spesso bisogno di essere presentato chiaramente! Grazie! –