OpenID sicurezza:RPs, non potendo garantire che auth è stato approvato dall'attuale fornitore
-
11-12-2019 - |
Domanda
Descrizione Generale
Ho implementato un OP (OpenID Provider), utilizzando DotNetOpenAuth.Io sono prove contro di esempio RPs (contando le parti), come Drupal OpenID login e la OpenIdRelyingPartyWebForms
progetto in DotNetOpenAuth s Samples
soluzione.
Il problema è che, per quanto posso dire, quando un browser rimbalza contro la mia OP e invia un "successo" autenticazione richiestamode: id_res
, claimed_id: smth
, etc.) torna a RP, RP non tenta di eseguire un server-side richiesta per l'OP e chiedere se, in realtà, ha autenticato l'utente.Vedo che c'è un openid.sig
firma restituito dall'OP, ma di nuovo, non vedo come il RP potrebbe verificare, dal momento che non si scambiano le chiavi con l'OP.
Quindi la domanda è: C'è qualche impostazione del po lato che posso attivare per rendere il flusso di lavoro sicuro?
Dettagli Tecnici
Sto usando Wireshark per sniffare il traffico HTTP in RP lato.Non c'è HTTPS, così posso vedere e leggere tutti i messaggi.Qui di seguito potete vedere cosa succede esattamente. B = Browser, OP = OpenID Provider, RP = Relying Party.I nomi a dominio vengono sostituiti con *.example.com.
(B –> RP) Utente tenta di visitare soci risorsa relying party.Ha ingressi OP endpoint che il browser invia il RP.
openid_identifier: http://OP.example.com/OpenId/Provider.aspx?xrds
(RP –> OPZIONI –> RP) RP problemi di server-side richiesta per la mia OP che restituisce un XRDS documento.Non trovo nulla di simile a chiave segreta scambio qui.
<?xml version="1.0" encoding="UTF-8"?> <xrds:XRDS xmlns:xrds="xri://$xrds" xmlns:openid="http://openid.net/xmlns/1.0" xmlns="xri://$xrd*($v*2.0)"> <XRD> <Service priority="10"> <Type>http://specs.openid.net/auth/2.0/server</Type> <Type>http://openid.net/extensions/sreg/1.1</Type> <URI>http://OP.example.com/OpenId/Provider.aspx</URI> </Service> </XRD> </xrds:XRDS>
(RP –> B –> OP) Relying party 302-reindirizza l'utente a OP s
/OpenId/Provider.aspx?[params]
URL, dove i parametri sono i seguenti:openid.claimed_id: http://specs.openid.net/auth/2.0/identifier_select openid.identity: http://specs.openid.net/auth/2.0/identifier_select openid.assoc_handle: {634730422000625000}{jkQC1Q==}{32} openid.return_to: http://RP.example.com/login.aspx?ReturnUrl=%2FMembersOnly%2FDefault.aspx&dnoa.receiver=ctl00_Main_OpenIdLogin1&dnoa.UsePersistentCookie=Session&dnoa.userSuppliedIdentifier=http%3A%2F%2FOP.example.com%2FOpenId%2FProvider.aspx%3Fxrds openid.realm: http://RP.example.com/ openid.mode: checkid_setup openid.ns: http://specs.openid.net/auth/2.0 openid.ns.sreg: http://openid.net/extensions/sreg/1.1 openid.sreg.policy_url: http://RP.example.com/PrivacyPolicy.aspx openid.sreg.required: email,gender,postcode,timezone
(OP –> B –> RP) Fornitore di autentica l'utente e il 302-redirect per le RP con i seguenti parametri URL:
ReturnUrl: /MembersOnly/Default.aspx dnoa.receiver: ctl00_Main_OpenIdLogin1 dnoa.UsePersistentCookie: Session dnoa.userSuppliedIdentifier: http://OP.example.com/OpenId/Provider.aspx?xrds openid.claimed_id: http://OP.example.com/OpenId/User.aspx/2925 openid.identity: http://OP.example.com/OpenId/User.aspx/2925 openid.sig: pWJ0ugjQATKGgRSW740bml9LDsSxFiJ+a9OLO6NlsvY= openid.signed: claimed_id,identity,assoc_handle,op_endpoint,return_to,response_nonce,ns.sreg,sreg.nickname,sreg.email openid.assoc_handle: {634730422000625000}{jkQC1Q==}{32} openid.op_endpoint: http://OP.example.com/OpenId/Provider.aspx openid.return_to: http://RP.example.com/login.aspx?ReturnUrl=%2FMembersOnly%2FDefault.aspx&dnoa.receiver=ctl00_Main_OpenIdLogin1&dnoa.UsePersistentCookie=Session&dnoa.userSuppliedIdentifier=http%3A%2F%2FOP.example.com%2FOpenId%2FProvider.aspx%3Fxrds openid.response_nonce: 2012-05-19T16:40:11ZSfsL4BK1 openid.mode: id_res openid.ns: http://specs.openid.net/auth/2.0 openid.ns.sreg: http://openid.net/extensions/sreg/1.1 openid.sreg.nickname: user@OP.example.com openid.sreg.email: user@OP.example.com
(RP –> OP) Il RP esegue un lato server HTTP di richiesta per l'OP.Non ci sono dati trasferiti, a richiesta GET precedentemente acquisiti utente URL di identità.Perché fare questa richiesta a tutti, a proposito?
GET /OpenId/User.aspx/2925 HTTP/1.1
(OP –> RP) L'OP risponde con un altro XRDS documento:
<xrds:XRDS xmlns:xrds="xri://$xrds" xmlns:openid="http://openid.net/xmlns/1.0" xmlns="xri://$xrd*($v*2.0)"> <XRD> <Service priority="10"> <Type>http://specs.openid.net/auth/2.0/signon</Type> <Type>http://openid.net/extensions/sreg/1.1</Type> <URI>http://OP.example.com/OpenId/Provider.aspx</URI> </Service> <Service priority="20"> <Type>http://openid.net/signon/1.0</Type> <Type>http://openid.net/extensions/sreg/1.1</Type> <URI>http://OP.example.com/OpenId/Provider.aspx</URI> </Service> </XRD> </xrds:XRDS>
(RP –> B) Che è.L'utente è autorizzato e RP mostra a lui i soli soci di risorse.
Soluzione
RPs in grado di operare in stateful o stateless modalità (noto anche come intelligente e stupido modalità, rispettivamente).Check out di rete, diagrammi di flusso per ogni.
C'è un momento di scambio di chiavi tra RP e OP, a condizione che il RP è operativo in modalità stateful.Se in modalità stateless, vedrete un messaggio da RP OP dopo ogni autenticazione per verificare l'affermazione della firma.
Per quanto riguarda la tua domanda #5 (HTTP TESTA di richiesta alla presunta identifier) è il DotNetOpenAuth RP verifica che l'OP è autorevole per l'identità si sta affermando.Dato che in precedenza aveva tirato questo URL, la cache a calci e evita il contenuto di trasferimento.
Altri suggerimenti
Mi sento stupido ora, mi sono perso qualcosa di fondamentale—ci è uno scambio di chiavi tra RP e OP, ma succede solo una volta, e quindi la chiave è nella cache su entrambi i lati per qualche tempo.
Quindi il mio attuazione di OpenID provider si rivelasse essere sicuro :)