2016-07-01 22 views
5

Obiettivo: Ospitare un'app Web ASP.NET in Azure e utilizzare OAuth2 per Google, Twilio e SendGrid, con un database per le informazioni utente.Come utilizzare in modo sicuro le credenziali all'esterno di web.config per ASP.NET e Azure

Edizione: Ho ricevuto errori durante la pubblicazione quando utilizzo un file di configurazione esterno che il mio "appSettings" nel mio file Web.config fa riferimento. In Azure ho anche inserito le credenziali per essere memorizzate in modo sicuro per Google OAuth2, che sovrascrive le impostazioni Web.config pubblicate dalla mia ricerca e comprensione. Come faccio a utilizzare e fare riferimento in modo corretto e sicuro all'interno delle credenziali sensibili al codice per Azure?

di ricerca: Ho seguito questo passo dopo passo Link -

https://azure.microsoft.com/en-us/documentation/articles/web-sites-dotnet-deploy-aspnet-mvc-app-membership-oauth-sql-database/ 

Questo link porta anche ad un altro collegamento per l'implementazione di Google OAuth2 qui sotto -

www.asp.net/mvc/overview/security/create-an-aspnet-mvc-5-app-with-facebook-and-google-oauth2-and-openid-sign-on#goog 

Tuttavia questo mette insicuro le informazioni sensibili all'interno del file web.config che sono annotate da una nota sulla sicurezza che porta qui per le migliori/sicure pratiche per la distribuzione di informazioni sensibili su ASP.NET in Azure -

www.asp.net/identity/overview/features-api/best-practices-for-deploying-passwords-and-other-sensitive-data-to-aspnet-and-azure 

La mia comprensione è che fare riferimento a un file esterno che contiene i dati sensibili/credenziali all'interno del file web.config è una buona pratica. Prendo atto che IIS non pubblica * .config e, a causa della posizione del file di configurazione di riferimento, anche "git add *" non aggiungerà le credenziali sensibili al repository.

web.config - (appSettings nota sulla linea 2)

</connectionStrings> 
    <appSettings file="..\..\AppSettingsSecrets.config">  
     <add key="webpages:Version" value="3.0.0.0" /> 
     <add key="webpages:Enabled" value="false" /> 
     <add key="ClientValidationEnabled" value="true" /> 
     <add key="UnobtrusiveJavaScriptEnabled" value="true" />  
    </appSettings> 
    <system.web> 

AppSettingsSecrets.config

<appSettings> 
    <!-- SendGrid--> 
    <add key="mailAccount" value="My mail account." /> 
    <add key="mailPassword" value="My mail password." /> 
    <!-- Twilio--> 
    <add key="TwilioSid" value="My Twilio SID." /> 
    <add key="TwilioToken" value="My Twilio Token." /> 
    <add key="TwilioFromPhone" value="+12065551234" /> 

    <add key="GoogClientID" value="1.apps.googleusercontent.com" /> 
    <add key="GoogClientSecret" value="My Google client secret." /> 
</appSettings> 

Come faccio corretto riferimento/in modo sicuro il mio ID e segreto dalla AppSettingsSecrets.config da all'interno del codice elencato nel passaggio 7?

www.asp.net/mvc/overview/security/create-an-aspnet-mvc-5-app-with-facebook-and-google-oauth2-and-openid-sign-on#goog 

codice rilevante è elencato di seguito (si noti il ​​fondo utilizzato per l'autenticazione di Google):

public void ConfigureAuth(IAppBuilder app) 
{ 
    // Configure the db context and user manager to use a single instance per request 
    app.CreatePerOwinContext(ApplicationDbContext.Create); 
    app.CreatePerOwinContext<ApplicationUserManager>(ApplicationUserManager.Create); 

    // Enable the application to use a cookie to store information for the signed in user 
    // and to use a cookie to temporarily store information about a user logging in with a third party login provider 
    // Configure the sign in cookie 
    app.UseCookieAuthentication(new CookieAuthenticationOptions 
    { 
     AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie, 
     LoginPath = new PathString("/Account/Login"), 
     Provider = new CookieAuthenticationProvider 
     { 
      OnValidateIdentity = SecurityStampValidator.OnValidateIdentity<ApplicationUserManager, ApplicationUser>(
       validateInterval: TimeSpan.FromMinutes(30), 
       regenerateIdentity: (manager, user) => user.GenerateUserIdentityAsync(manager)) 
     } 
    }); 

    app.UseExternalSignInCookie(DefaultAuthenticationTypes.ExternalCookie); 

    // Uncomment the following lines to enable logging in with third party login providers 
    //app.UseMicrosoftAccountAuthentication(
    // clientId: "", 
    // clientSecret: ""); 

    //app.UseTwitterAuthentication(
    // consumerKey: "", 
    // consumerSecret: ""); 

    //app.UseFacebookAuthentication(
    // appId: "", 
    // appSecret: ""); 

    app.UseGoogleAuthentication(
     clientId: "000-000.apps.googleusercontent.com", 
     clientSecret: "00000000000"); 
} 

Inoltre nel tutorial per la distribuzione segreti per Azure Questa informazioni sono elencate:

When you deploy your web app to Azure, the AppSettingsSecrets.config file won't be deployed (that's what you want). You could go to the Azure Management Portal and set them manually, to do that: 
1. Go to http://portal.azure.com, and sign in with your Azure credentials. 
2. Click Browse > Web Apps, then click the name of your web app. 
3. Click All settings > Application settings. 
The app settings and connection string values override the same settings in the web.config file. In our example, we did not deploy these settings to Azure, but if these keys were in the web.config file, the settings shown on the portal would take precedence. 

Questo mi dice che posso inserire manualmente le informazioni sensibili in Azure attraverso il portale e (presumo) questo è un metodo sicuro per mantenere credenziali riservate private pur consentendo alla mia applicazione web di accedere e utilizzare le informazioni. (Si prega di correggermi se sbaglio!) Tuttavia, quando ho inserito manualmente queste informazioni, la mia applicazione web è ora gettando un errore di runtime come illustrato di seguito come un link d'immagine:

Server Runtime Error

Qualsiasi suggerimenti, o altri link o puntatori/suggerimenti sarebbero molto apprezzati! Grazie in anticipo!

EDIT: Dopo aver spento le customErrors nel file web.config, e aggiornare la distribuzione Azure questo è l'errore nel sito ora produce - In sostanza il mio codice non sta tirando le credenziali di Google OAuth2 memorizzati ho memorizzato in Azzurro. Come faccio a ottenere il mio codice per recuperare le credenziali archiviate in Azure per Google OAuth2? NewSiteError

+0

Hai disattivato CustomErrors nella configurazione per vedere qual è la traccia dello stack? Sarebbe utile sapere. Inoltre, AppSettingsSecrets.config è incluso nella soluzione? se non la pubblicazione non lo includerà. –

+0

AppSettingsSecrets.config non è incluso nella mia soluzione, in quanto il link Best Practices afferma che non è sicuro includere dati sensibili all'interno della soluzione e averli pubblicati (come semplicemente incluso nel file web.config) - Come notato nella mia ricerca sopra lo scopo è in modo che AppSettingsSecrets.config NON sia effettivamente incluso nella pubblicazione, il che mi riporta alla domanda su come utilizzare in modo sicuro dati sensibili per OAuth2 ecc. – jat247

risposta

1

Per prima cosa disattiva gli CustomErrors in modo da poter trovare il vero problema, ma la mia ipotesi è che non si includa AppSettingsSecrets.config nella propria soluzione. Ciò causerà un problema una volta distribuito perché il file non è lì - quindi dovresti rimuovere gli attributi configSource o file dalla configurazione usando una trasformazione web.config.

Così alla Web.Release.config è possibile aggiungere il seguente all'interno del:

<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform"> 
... 
    <connectionStrings xdt:Transform="RemoveAttributes(configSource)"/> 
    <appSettings xdt:Transform="RemoveAttributes(file)"/> 

quando si esegue una pubblica della build di rilascio, questo rimuoverà quei percorsi dei file dalla configurazione in modo che ha vinto' t fallire all'avvio una volta schierato.

Aggiornamento

Ora è necessario aggiungere tutte le appSettings che erano nel file AppSettingsSecrets.config ai appSettings nel portale. Ciò manterrà le credenziali del sito pubblicato solo in Azure.

Tutte le appSettings nel file Web.config e in qualsiasi altro file vengono unite nello stesso elenco (ovvero il codice non ha bisogno di conoscere l'appImpostazione proviene da web.config, AppSettingsSecrets.config o viene configurata dal . portale azzurro Ecco un buon articolo su appsettings: https://buildazure.com/2015/11/30/azure-web-app-application-settings/

le cose buone sulla tua configurazione è:

  1. l'AppSettingsSecrets.config ha i segreti necessari solo per sviluppatori e non è incluso nel controllo del codice sorgente o pubblicato
  2. le credenziali del sito pubblicate sono solo in Azure e disponibili per solo per quelle con accesso all'account di Azure.
+0

Ho disattivato CustomErrors, l'errore ora è solo una pagina Web vuota con il testo "La pagina non può essere visualizzata perché si è verificato un errore interno del server." Ho aggiunto la riga di codice che hai elencato sopra al file Web.Release.config e ri-pubblicata. L'errore "La pagina non può essere visualizzata perché si è verificato un errore interno del server." è ancora quello che ottengo. – jat247

+0

Ho aggiornato la configurazione in Azure. L'errore è ora elencato nella mia modifica nel mio post principale. Anche se ho inserito le credenziali di Google OAuth2 in Azure, non so come ottenere il mio codice Web per estrarre le credenziali, quindi il sito non riesce a caricare e restituisce l'errore collegato sopra. Come faccio a ottenere il mio codice per recuperare le credenziali di OAuth2 di Google archiviate in Azure che ho inserito? – jat247

+1

Questo è esattamente quello che stavo cercando!Ho avuto le credenziali all'interno delle impostazioni dell'app in Azure, ma la mia applicazione web non disponeva del codice per fare riferimento correttamente a tali credenziali per poterle utilizzare. Grazie! – jat247

Problemi correlati