Come utilizzare System.IdentityModel nella propria applicazione client-server
-
22-07-2019 - |
Domanda
Ho una semplice applicazione client-server basata su TcpClient / TcpListener e SslStream. I client possono autenticarsi sul server utilizzando un certificato X509 o inviando un nome utente e una password dopo aver stabilito SslStream.
WCF utilizza lo spazio dei nomi System.IdentityModel a fini di autenticazione, ma apparentemente che può essere usato in applicazioni arbitrarie - che sembra interessante. Le informazioni su come farlo sono scarse (o il mio foo di Google è debole oggi).
Quindi, la mia domanda è: Cosa devo fare per integrare System.IdentityModel con la mia applicazione? Non sono sicuro di aver bisogno di tutto ciò che è ClaimSet, ma sarebbe bello se gli utenti possono accedere semplicemente utilizzando il proprio account Windows o qualsiasi altro meccanismo di autenticazione fornito. (Sfortunatamente non posso solo passare a WCF ma devo usare il protocollo personalizzato, anche se posso apportare alcune modifiche se necessario.)
Soluzione
Il mio foo di Google era davvero debole. La risposta è proprio dietro il link nella mia domanda. Quindi ecco un paio di link a questo blog nel caso in cui qualcuno abbia la stessa domanda alla fine.
Per prima cosa, dovresti provare a capire "che rivendicano elementi definiti":
- Reclami
- Set di reclami
- Ispezione dei set di reclami
- Set di richieste di certificati Windows e X509
- Operazioni tipiche sui set di reclami
Quindi, devi sapere da dove provengono i set di attestazioni:
- Politiche di autorizzazione, contesto e Trasformazione reclami
- Trasformazione reclami in WCF
- Autorizzazione Trasformazione di contestazioni e sinistri al di fuori di WCF
Armato di questa conoscenza, in realtà diventa abbastanza semplice.
Se lo capissi correttamente, il flusso di lavoro di base sarebbe qualcosa del genere:
- Il client crea un
SecurityToken
utilizzando unSecurityTokenProvider
- Il client serializza il
SecurityToken
utilizzando unSecurityTokenSerializer
- Il server deserializza il
SecurityToken
utilizzando unSecurityTokenSerializer
- Il server crea
IAuthorizationPolicy
usando unSecurityTokenAuthenticator
- Il server crea
AuthorizationContext
daIAuthorizationPolicy
s - Fatto
Esempio:
// Create the SecurityTokenProvider
var p = new UserNameSecurityTokenProvider("username", "password");
// Get the SecurityToken from the SecurityTokenProvider
var t = p.GetToken(TimeSpan.FromSeconds(1.0)) as UserNameSecurityToken;
// ... transmit SecurityToken to server ...
// Create the SecurityTokenAuthenticator
var a = new CustomUserNameSecurityTokenAuthenticator(
UserNamePasswordValidator.None);
// Create IAuthorizationPolicies from SecurityToken
var i = a.ValidateToken(t);
// Create AuthorizationContext from IAuthorizationPolicies
var c = AuthorizationContext.CreateDefaultAuthorizationContext(i);
ShowClaims(c.ClaimSets);
Per X509SecurityToken
utilizzare un X509SecurityTokenProvider
/ Authenticator
. Per WindowsSecurityToken
c'è un WindowsSecurityTokenAuthenticator
ma non un provider; utilizzare invece il costruttore WindowsSecurityToken
:
var t = new WindowsSecurityToken(WindowsIdentity.GetCurrent());
Funziona abbastanza bene. L'unica cosa che ho omesso finora è la serializzazione di token. Esiste una classe SecurityTokenSerializer
che ha un'implementazione nel framework .NET: la classe WSSecurityTokenSerializer
fornita con WCF.
La serializzazione di UserNameSecurityToken
e X509SecurityToken
funziona come un incantesimo (non ho provato la deserializzazione), ma apparentemente non sono supportati da WindowsSecurityToken
il serializzatore. Questo mi lascia con i due metodi di autenticazione che ho già (certificati e nome utente / password) e, poiché non volevo comunque AuthorizationContext
, rimarrò fedele a quello che ho:)
Altri suggerimenti
Non ho la reputazione di pubblicare un commento sulla soluzione esistente, ma mi piacerebbe pubblicare i nuovi URL sui blog elencati nella soluzione, dal momento che quelli non funzionano più. Se qualcuno può cambiarlo in un commento, sarei molto obbligato.
- Reclami
- Set di reclami
- Ispezione dei set di reclami
- Set di attestazioni di certificati Windows e X509
- Operazioni tipiche sui set di attestazioni
- Politiche di autorizzazione, trasformazione del contesto e delle attestazioni
- Reclami trasformazione in WCF
- Trasformazione del contesto di autorizzazione e reclami al di fuori di WCF