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

È stato utile?

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":

Quindi, devi sapere da dove provengono i set di attestazioni:

Armato di questa conoscenza, in realtà diventa abbastanza semplice.

Se lo capissi correttamente, il flusso di lavoro di base sarebbe qualcosa del genere:

  1. Il client crea un SecurityToken utilizzando un SecurityTokenProvider
  2. Il client serializza il SecurityToken utilizzando un SecurityTokenSerializer
  3. Il server deserializza il SecurityToken utilizzando un SecurityTokenSerializer
  4. Il server crea IAuthorizationPolicy usando un SecurityTokenAuthenticator
  5. Il server crea AuthorizationContext da IAuthorizationPolicy s
  6. 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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top