2016-05-20 38 views
10

Sto cercando di ottenere un esempio funzionante di autenticazione di un'applicazione MVC in .NET contro Salesforce utilizzando il loro flusso di lavoro di autenticazione OAuth. Ho fatto riferimento a this walkthrough che è abbastanza semplice. È molto simile al fatto che l'autenticazione di Google funzioni. Si riduce all'impostazione del progetto .NET MVC con il modello di autenticazione dell'account individuale e crea una nuova applicazione connessa in Salesforce. Quindi aggiungere la libreria Owin.Security.Providers per Salesforce, regolare un po 'lo Startup.Auth.cse includere ClientId e ClientSecret dall'app Salesforce e gli endpoint Autorizzazione e Token. L'URL di richiamata che suggerisce è http://localhost:[port]/signin-salesforce che è molto simile all'URL di richiamata utilizzato per l'autenticazione di Google.MVC autenticazione OAuth con Salesforce ritorna alla pagina di login

Mentre sono reindirizzato a Salesforce e posso accedere, la stretta di mano che mi riporta alla mia applicazione MVC sembra incontrare un problema che non riesco a definire. Vengo reindirizzato alla pagina di accesso e .NET non sembra essere a conoscenza delle mie informazioni di accesso, anche se ho sicuramente una sessione attiva con Salesforce (il dashboard di Salesforce mi collegherà automaticamente). Nel codice, le cose cominciano ad andare di traverso qui:

// GET: /Account/ExternalLoginCallback 
[AllowAnonymous] 
public async Task<ActionResult> ExternalLoginCallback(string returnUrl) 
{ 
    var loginInfo = await AuthenticationManager.GetExternalLoginInfoAsync(); 
    if (loginInfo == null) 
    { 
     return RedirectToAction("Login"); 
    } 
    //more code we never reach 
} 

loginInfo è sempre nullo. Così, per capire che tipo di richiesta viene inviato a NET, ho girato a Fiddler e incontrato una richiesta contro localhost:[port]/signin-salesforce con un gruppo di parametri che ottiene una risposta curiosa:

HTTP/1.1 302 Trovato

?

Località:/account/ExternalLoginCallback errore = ACCESS_DENIED

Server: Microsoft-IIS/10.0

Set-Cookie: .AspNet.Correlation.Salesforce =; percorso = /; scade = Thu, 01-gen-1970 00:00:00 GMT

X-SourceFiles: = UTF-8 B YzpcdXNlcnNcc3RldmUuY2FtaXJlXGRvY3VtZW50c1x2aXN1YWwgc3R1ZGlvIDIwMTVcUHJvamVjdHNcU2FsZXNGb3JjZUludGVncmF0aW9uXFNhbGVzRm9yY2VJbnRlZ3JhdGlvblxzaWduaW4tc2FsZXNmb3JjZQ == =

X-Powered-By:???? ASP.NET

Data: Fri, 20 maggio 2016 21:46:09 GMT

Content-Length: 0

nota l'intestazione Location , che dice a .NET di reindirizzare a /Account/ExternalLoginCallback con un parametro di errore "access_denied". Abilitando un po 'di tracciato inrivela che qualcosa restituisce un 400 in .NET o su .NET, ma non so cosa sia.

Quindi, è lì che sono. Un oggetto loginInfo null nel controller e la prova che qualcosa sta andando storto in alcune richieste web. Ho esaminato diverse altre domande correlate, ma quasi nessuna si concentra su SalesForce e fornisce risposte che non sono realmente applicabili (ad esempio, non ho API di Google+ da abilitare). Qualche idea su come rettificare questo?

+1

Hai trovato una soluzione a questo? Ho lo stesso problema. – vaibinewbee

+1

@vaibinewbee Purtroppo, non l'ho fatto. Lo stavo facendo per alcune ricerche, che ho finito per non dover completare, quindi non ho continuato a cercare una soluzione. Considerando la completa mancanza di attività su questa domanda, suggerirei di raggiungere alcuni forum di Salesforce o di contattare direttamente Salesforce. Se lo risolvi, condividi la risposta qui. Ho un segno di spunta verde in attesa di essere utilizzato su un'ottima risposta. – Ellesedil

+1

per favore non testare le autenticazioni esterne con 'localhost'. Provalo nel dominio del mondo reale e dimmi il risultato. –

risposta

0

A tutti coloro che hanno problemi con il loginInfo che ritornano sempre nulli quando in realtà non dovrebbero essere, questo potrebbe non risolvere il problema, tuttavia trascorro giorni su un problema simile con Facebook e Google.Ho finito per cancellare la sessione HttpContext prima che ExternalLoginCallback venisse richiamato e da allora ha funzionato perfettamente. Non dire questo lo risolverà, ma si spera che aiuti qualcuno.

// 
// POST: /Account/ExternalLogin 
[HttpPost] 
[AllowAnonymous] 
[ValidateAntiForgeryToken] 
public ActionResult ExternalLogin(string provider, string returnUrl) 
{ 
    // Clear any other session first as this seems to cause unexpected null responses. 
    if (ControllerContext.HttpContext.Session != null) 
    { 
     ControllerContext.HttpContext.Session.RemoveAll(); 
    } 

    // Request a redirect to the external login provider 
    return new ChallengeResult(provider, Url.Action("ExternalLoginCallback", "Account", new { ReturnUrl = returnUrl })); 
} 

Quando stavo testando il mio, ho controllato con Fiddler e mi è stato sempre un segno di nuovo a posto, se non si ottiene una risposta valida allora questo non vi aiuterà.

2

Sembra che l'URI di reindirizzamento sia necessario per corrispondere a quello sul server Identity. Mentre ti stai reindirizzando nuovamente alla pagina di accesso, sembra che l'URI di reindirizzamento potrebbe non corrispondere all'ID cliente e Client segreto.

Nel server SalesForce Identity, sarà presente un URI di reindirizzamento che deciderà il percorso in cui verrà reindirizzato una volta eseguita l'autenticazione. A volte devi anche fornire l'URI con ID cliente e segreto per ottenere l'autorizzazione completa.

+0

Non ho avuto l'opportunità di testarlo da solo (e non sono sicuro se lo farò presto), ma questa sembra la cosa più probabile che dovrei controllare dopo.Sto solo impostando l'ID cliente nella proprietà client, ma non includendo alcun URL. – Ellesedil

1

Vorrei controllare Startup.Auth.cs e verificare che la propria organizzazione abbia l'istanza corretta e non si stia utilizzando quella nella procedura dettagliata (se diversa). La mia organizzazione, ad esempio, inizia con na10.salesforce.com. La procedura dettagliata utilizza ap1.salesforce.com.

AuthorizationEndpoint = "https://**ap1**.salesforce.com/services/oauth2/authorize", 
    TokenEndpoint = "https://**ap1**.salesforce.com/services/oauth2/token" 

vorrei anche assicurare che i cookie e cache vengono cancellati. Ad esempio, ho attivato un nuovo progetto VS 2015 MVC, senza qualsiasi informazioni OAuth e mi sono registrato tramite il provider SFDC. Nessun ID cliente, segreto, nemmeno una sezione SFDC!

Ho fatto la procedura dettagliata ed è stato in grado di autenticarsi con SFDC OAuth. Come hai detto tu, è stato molto semplice. Non vorrei distruggere il tuo codice tanto quanto preoccuparti di qualcosa di semplice.

+0

Ho sicuramente aggiornato gli URL nel progetto a quelli della mia istanza. Anche se buono da ricontrollare, questo non era il mio problema. – Ellesedil

1

Ho inoltre proseguito con il download del codice Owin.Security.Providers.Salesforce e l'ho aggiunto al riferimento del mio progetto per poter eseguire il debug del problema. Ho scoperto che quando veniva eseguita la risposta per l'oauth code swap, ricevevo un'eccezione per "Il codice di stato della risposta non indica il successo: 400 (richiesto TLS 1.1 o superiore)." Stavo lavorando fuori della sandbox e Salesforce ha disattivato TLS 1.0 a partire da giugno 2016. quindi l'aggiunta di questa riga di codice sul mio account di controller di Constructor fisso il mio problema:

System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12; 
Problemi correlati