Domanda

Diciamo che hai siti web www.xyz.com e www.abc.com.

Supponiamo che un utente vada su www.abc.com e venga autenticato tramite il normale provider di appartenenze ASP .NET.

Quindi, da quel sito, vengono inviati al sito www.xyz.com (reindirizzamento, collegamento, qualunque cosa funzioni) e l'intento del sito www.abc.com era di trasferire quell'utente all'altro sito con lo stato di isAuthenticated, in modo che il sito www.xyz.com non richieda nuovamente le credenziali di detto utente.

Cosa sarebbe necessario affinché funzioni?Tuttavia ho alcuni vincoli al riguardo, i database degli utenti sono completamente separati, non è interno a un'organizzazione, sotto tutti gli aspetti, è come passare da Stackoverflow.com a Google come autenticato, è di natura separata.Sarà sufficiente un collegamento a un articolo pertinente.

È stato utile?

Soluzione

Prova a utilizzare FormAuthentication impostando la sezione di autenticazione web.config in questo modo:

<authentication mode="Forms">
  <forms name=".ASPXAUTH" requireSSL="true" 
      protection="All" 
      enableCrossAppRedirects="true" />
</authentication>

Generare una chiave macchina.Esempio: Il modo più semplice per generare MachineKey: suggerimenti e trucchi:ASP.NET, IIS...

Quando si pubblica su un'altra applicazione, il ticket di autenticazione viene passato come campo nascosto.Durante la lettura del post dalla prima app, la seconda app leggerà il ticket crittografato e autenticherà l'utente.Ecco un esempio della pagina che passa e pubblica il campo:

.aspx:

<form id="form1" runat="server">
  <div>
    <p><asp:Button ID="btnTransfer" runat="server" Text="Go" PostBackUrl="http://otherapp/" /></p>
    <input id="hdnStreetCred" runat="server" type="hidden" />
  </div>
</form>

codice dietro:

protected void Page_Load(object sender, EventArgs e)
{
    FormsIdentity cIdentity = Page.User.Identity as FormsIdentity;
    if (cIdentity != null)
    {
        this.hdnStreetCred.ID = FormsAuthentication.FormsCookieName;
        this.hdnStreetCred.Value = FormsAuthentication.Encrypt(((FormsIdentity)User.Identity).Ticket);
    }
}

Vedere anche la sezione relativa all'autenticazione del modulo tra app nel capitolo 5 del presente libro da Wrox.Raccomanda risposte come quelle sopra oltre a fornire una soluzione SSO homebrew.

Altri suggerimenti

Se stai utilizzando il sistema di appartenenza integrato, puoi eseguire l'autenticazione tra sottodomini con l'autenticazione dei moduli utilizzandone alcuni come questo in ogni web.config.

<authentication mode="Forms">
    <forms name=".ASPXAUTH" loginUrl="~/Login.aspx" path="/" 
                  protection="All" 
                  domain="datasharp.co.uk" 
                  enableCrossAppRedirects="true" />

</authentication>

Assicurati che nome, percorso, protezione e dominio siano gli stessi in tutti i web.config.Se i siti si trovano su macchine diverse dovrai anche assicurarti che machineKey e le chiavi di convalida e crittografia siano le stesse.

Se memorizzi le sessioni utente nel database, puoi semplicemente verificare l'esistenza del Guid nella tabella delle sessioni, se esiste, quindi l'utente è già autenticato sull'altro dominio.Affinché funzioni, dovresti includere il guid della sessione nell'URL quando reindirizzi l'utente all'altro sito web.

Non sono sicuro di cosa utilizzeresti per .NET, ma normalmente lo userei memcached in uno stack LAMP.

La risoluzione dipende dal tipo di applicazione e dall'ambiente in cui viene eseguita.Per esempio.su intranet con dominio NT è possibile utilizzare NTLM per passare le credenziali di Windows direttamente ai server nel perimetro intranet senza la necessità di duplicare le sessioni.

L'approccio su come eseguire questa operazione è generalmente denominato accesso singolo (Vedere Wikipedia).

Esistono diversi approcci a questo problema, descritto come "Single Sign On tra domini".L'articolo di Wikipedia indicato da Matej è particolarmente utile se stai cercando una soluzione open source, tuttavia, in un ambiente Windows credo che sia meglio con uno dei 2 approcci:

  1. Acquista un prodotto SSO commerciale (come SiteMinder o PingIdentity)
  2. Utilizza la soluzione SSO interdominio di MicroSoft, denominata ADFS - Servizi federativi di Active Directory.(federazione è il termine per coordinare il comportamento di più domini)

Ho usato SiteMinder e funziona bene, ma è costoso.Se ti trovi in ​​un ambiente interamente MicroSoft, penso che ADFS sia la soluzione migliore.Inizia con questo Libro bianco su ADFS.

Vorrei utilizzare qualcosa come CAS:

[1]: http://www.ja-sig.org/products/cas/ CAS

Questo è un problema risolto e non consiglierei di crearne uno tuo.

In alternativa, se vuoi crearne uno tuo e i siti in questione non si trovano sugli stessi server o non hanno accesso a un database condiviso (in tal caso vedi le risposte sopra), puoi inserire un webfaro su ciascuno dei siti che rimandano all'altro sito.

Posiziona un'immagine a pixel singolo (web beacon) sul sito A che chiamerebbe il sito B passando attraverso l'ID utente (crittografato e con timestamp).Ciò creerebbe quindi una nuova sessione utente sul sito B per l'utente che verrebbe impostato come connesso.Quindi, quando l'utente visitasse il sito B, avrebbe già effettuato l'accesso.

Per ridurre al minimo le chiamate è possibile posizionare il web beacon solo sulla home page e/o accedere alle pagine di conferma.L'ho usato con successo in passato per passare informazioni tra siti partner.

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