2010-02-16 10 views
20

Ho due applicazioni asp.net su un server IIS e vorrei utilizzare lo stesso database asp_security e il provider di appartenenza. Ho letto che tutto ciò che devo fare è fare riferimento allo stesso nome dell'applicazione in entrambe le configurazioni Web come sto facendo ora, ma devo fare qualcosa di sbagliatoUtilizzo di un unico database Asp.net Membership con più applicazioni Single Sign On

In ogni applicazione web.config ho questa sezione.

<membership> 
    <providers> 
    <clear/> 
    <add name="AspNetSqlMembershipProvider" 
       type="System.Web.Security.SqlMembershipProvider, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" 
       connectionStringName="membership" 
       enablePasswordRetrieval="false" 
       enablePasswordReset="true" 
       requiresQuestionAndAnswer="false" 
       applicationName="/" 
       requiresUniqueEmail="false" 
       minRequiredPasswordLength="5" 
       minRequiredNonalphanumericCharacters="0" 
       passwordFormat="Hashed" 
       maxInvalidPasswordAttempts="5" 
       passwordAttemptWindow="10" 
       passwordStrengthRegularExpression="" 
       /> 
    </providers> 
</membership> 

Quando entro dall'applicazione A e Sfoglia per applicazione applicazione B B sembra non sapere nulla di me o le mie credenziali dall'applicazione A. Qualcuno ha qualche idea di cosa sto facendo in modo errato?

risposta

20

Solo per chiusura, risponderò a come ho raggiunto l'obiettivo di ciò che la mia domanda iniziale voleva dire.

Avevo due applicazioni asp.net su un server IIS. Il mio obiettivo era di farlo in modo che quando l'utente si connetteva all'app1 le sue credenziali utente fossero disponibili in app2. La configurazione del provider di appartenenza asp.net è solo un passaggio di quello che stavo cercando. Anche se entrambe le app utilizzavano lo stesso database e provider di back-end, non verrei ancora autenticato quando raggiungo app2. Quello che stavo cercando era una soluzione Single Sign-On.

Una volta che avete entrambe le applicazioni che punta al database asp_membership inserendo il seguente nella sezione system.web del web di configurazione

<authentication mode="Forms" /> 
<membership> 
    <providers> 
    <clear/> 
    <add name="AspNetSqlMembershipProvider" 
       type="System.Web.Security.SqlMembershipProvider, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" 
       connectionStringName="membership" 
       applicationName="/" 
       /> 
    </providers> 
</membership> 
<roleManager enabled="true" /> 

assicurarsi che entrambi hanno lo stesso insieme di proprietà applicationname.

Stavo usando IIS 6 così l'ho configurato per generare automaticamente un codice macchina per entrambe le applicazioni. Poiché entrambe queste applicazioni risiedono sulla stessa macchina, la chiave sarebbe identica, questa è la parte fondamentale per il funzionamento dell'SSO. Dopo aver impostato IIS è stato aggiunto al mio web.config

<machineKey decryptionKey="AutoGenerate" validation="SHA1" validationKey="AutoGenerate" /> 

Questo era tutto quello che c'era ad esso quanto segue. Fatto ciò, potevo accedere all'app1 e quindi navigare su app2 e mantenere le mie credenziali di sicurezza.

Grazie per la spinta nella giusta direzione.

+1

Grazie mille! Il tuo problema era esattamente lo stesso del mio. La maggior parte delle soluzioni SSO erano abbastanza complesse per andare avanti e non ha mai funzionato per me, grazie ancora! – stillsmallvoice

2

Se la mia comprensione mi serve correttamente, le credenziali di autenticazione degli utenti sono memorizzate nel contesto HTTP di ciascuna applicazione. Quindi, il passaggio tra le due applicazioni non esegue l'autenticazione automaticamente l'utente, dal momento che un nuovo contesto verrà creato quando si passa alla applicazione B.

Quello che credo possa l'approccio corretto sarebbe quello di utilizzare la proprietà DefaultCredentials (o UseDefaultCredentials-True) dell'utente corrente prima di passare all'app B.

Quando si dice di cambiare, ad es. aprire una finestra del browser diversa e accedere all'app B o richiedere una pagina da appB da appA?

+0

Penso che potresti avere ragione visto che ora riesco a vedere il mio database ma non ho un utente che ha effettuato l'accesso quando navigo in AppB. A quale API ti riferisci quando parli di DefaultCredentials? ... e se ho intenzione di "passare" tra le applicazioni in base alla mappa del sito, si vede un modo per impostarlo su ogni pagina all'uscita? Grazie per il tuo tempo – jim

+2

La proprietà UseDefaultCredentials in System.Net (http://msdn.microsoft.com/en-us/library/system.net.credentialcache.defaultcredentials.aspx). Sul secondo punto, credo che sia necessario impostare la chiave della macchina in entrambi i file web.config dell'app. Vedi questo articolo MSDN per maggiori informazioni http://msdn.microsoft.com/en-us/library/eb0zx8fc.aspx – Ahmad

+1

ti stai sbagliando. L'autenticazione dei moduli Asp.net è tracciata in un ticket crittografato. questo biglietto può essere memorizzato in un cookie o nell'URL. l'OP ha solo bisogno, come ora sa, di garantire che i nomi delle applicazioni siano uguali e che ogni app condivida una comune chiave del computer. –

Problemi correlati