2012-10-18 10 views
9

पर प्रकाशित करने के बाद प्रमाणीकरण समस्याएं मेरे पास एक मूल एएसपी.नेट एमवीसी 4 साइट है जिसे मैं Azure वेबसाइटों पर होस्ट कर रहा हूं। प्रमाणीकरण फॉर्म प्रमाणीकरण है और डिफ़ॉल्ट टेम्पलेट से अनुकूलित नहीं किया गया है। जब भी मैं प्रकाशित करता हूं, जब मैं अपनी साइट पर फिर से जाता हूं, तो अंततः मुझे एक त्रुटि संदेश दिखाने से पहले बहुत लंबे समय तक (शायद कुछ मिनट) लटकता है। मैं अपने ब्राउज़र में साइट के लिए कुकीज़ को हटाने और पुनः लोड करके पुनर्प्राप्त कर सकता हूं।एमवीसी 4 ऐप को अज़ूर

शुरू में समस्या सिर्फ इतना है कि प्रमाणीकरण आवश्यक पृष्ठों का उपयोग करने के लिए कोशिश कर रहा था, लेकिन फिर मैं करने के लिए इस जोड़ा अपने साझा किए गए _Layout.cshtml:

@if (User.IsInRole("Admin")) 
{ 
    <li>@Html.ActionLink("Admin", "Index", "Admin")</li> 
} 

जो अब के बाद एक नया प्रकाशित सुलभ हैं सब पर कोई पृष्ठों का मतलब है, और इसलिए मैं लॉगआउट लिंक पर भी क्लिक नहीं कर सकता, जो कि एक और तरीका था जिसे मैं इस मुद्दे को ठीक करने में सक्षम था।

क्या मुझे कुछ गलत कॉन्फ़िगर किया गया है? यद्यपि मेरे पास एक कामकाज है, लेकिन मैं खुद का उपयोग कर सकता हूं, यह अद्यतन प्रकाशित करने के बाद साइट के उपयोगकर्ताओं के लिए यह एक अच्छा अनुभव नहीं होगा।

संपादित करें: ELMAH लॉग से, ऐसा लगता है कि फॉर्म प्रमाणीकरण IInRole को कॉल करते समय SQL एक्सप्रेस डेटाबेस बनाने का प्रयास कर रहा है। मैं नहीं देख सकता कि यह ऐसा क्यों करेगा, क्योंकि मेरे फॉर्म प्रमाणीकरण को मेरे SQL Azure डेटाबेस का उपयोग करने के लिए सेट अप किया गया है।

System.Web.HttpException (0x80004005): Unable to connect to SQL Server database. ---> System.Data.SqlClient.SqlException (0x80131904): A network-related or instance-specific error occurred while establishing a connection to SQL Server. The server was not found or was not accessible. Verify that the instance name is correct and that SQL Server is configured to allow remote connections. (provider: SQL Network Interfaces, error: 26 - Error Locating Server/Instance Specified) 
    at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection) 
    at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning() 
    at System.Data.SqlClient.TdsParser.Connect(ServerInfo serverInfo, SqlInternalConnectionTds connHandler, Boolean ignoreSniOpenTimeout, Int64 timerExpire, Boolean encrypt, Boolean trustServerCert, Boolean integratedSecurity, Boolean withFailover) 
    at System.Data.SqlClient.SqlInternalConnectionTds.AttemptOneLogin(ServerInfo serverInfo, String newPassword, Boolean ignoreSniOpenTimeout, TimeoutTimer timeout, SqlConnection owningObject, Boolean withFailover) 
    at System.Data.SqlClient.SqlInternalConnectionTds.LoginNoFailover(ServerInfo serverInfo, String newPassword, Boolean redirectedUserInstance, SqlConnection owningObject, SqlConnectionString connectionOptions, TimeoutTimer timeout) 
    at System.Data.SqlClient.SqlInternalConnectionTds.OpenLoginEnlist(SqlConnection owningObject, TimeoutTimer timeout, SqlConnectionString connectionOptions, String newPassword, Boolean redirectedUserInstance) 
    at System.Data.SqlClient.SqlInternalConnectionTds..ctor(DbConnectionPoolIdentity identity, SqlConnectionString connectionOptions, Object providerInfo, String newPassword, SqlConnection owningObject, Boolean redirectedUserInstance) 
    at System.Data.SqlClient.SqlConnectionFactory.CreateConnection(DbConnectionOptions options, Object poolGroupProviderInfo, DbConnectionPool pool, DbConnection owningConnection) 
    at System.Data.ProviderBase.DbConnectionFactory.CreateNonPooledConnection(DbConnection owningConnection, DbConnectionPoolGroup poolGroup) 
    at System.Data.ProviderBase.DbConnectionFactory.GetConnection(DbConnection owningConnection) 
    at System.Data.ProviderBase.DbConnectionClosed.OpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory) 
    at System.Data.SqlClient.SqlConnection.Open() 
    at System.Web.Management.SqlServices.GetSqlConnection(String server, String user, String password, Boolean trusted, String connectionString) 
ClientConnectionId:00000000-0000-0000-0000-000000000000 
    at System.Web.Management.SqlServices.GetSqlConnection(String server, String user, String password, Boolean trusted, String connectionString) 
    at System.Web.Management.SqlServices.SetupApplicationServices(String server, String user, String password, Boolean trusted, String connectionString, String database, String dbFileName, SqlFeatures features, Boolean install) 
    at System.Web.Management.SqlServices.Install(String database, String dbFileName, String connectionString) 
    at System.Web.DataAccess.SqlConnectionHelper.CreateMdfFile(String fullFileName, String dataDir, String connectionString) 
    at System.Web.DataAccess.SqlConnectionHelper.EnsureSqlExpressDBFile(String connectionString) 
    at System.Web.DataAccess.SqlConnectionHelper.GetConnection(String connectionString, Boolean revertImpersonation) 
    at System.Web.Security.SqlRoleProvider.GetRolesForUser(String username) 
    at WebMatrix.WebData.SimpleRoleProvider.GetRolesForUser(String username) 
    at System.Web.Security.RolePrincipal.IsInRole(String role) 
+0

मार्क मैंने इस प्रश्न का मेरे यहां इसी तरह के संदर्भ में संदर्भित किया है ... http://stackoverflow.com/questions/24149044/two-chrome-sessions-on-the-same-machine-one-will-connect करने वाली हमारी-नीला-वेबसाइट और अगर काम करता है नीचे अपने जवाब, वास्तव में इनाम अपना रास्ता ... – hawbsl

उत्तर

9

विभिन्न ब्लॉग पोस्ट से अलग सुझाव के दर्जनों की कोशिश कर के बाद, मैं एक समाधान मिल गया है। मेरे घर नियंत्रक को InitialiseSimpleMembership विशेषता जोड़ने से समस्या हल हो जाती है।

[InitializeSimpleMembership] 
public class HomeController : Controller 

इस परिवर्तन के बाद, मैंने बिना किसी समस्या के कई सफल प्रकाशन प्रबंधित किए। मुझे लगता है कारण InitializeSimpleMembershipAttribute निर्माता में कोड की निम्न पंक्ति को चलाने के लिए की जरूरत है कि इससे पहले कि User.IsInRole के लिए किसी भी कॉल किया जाता है:

WebSecurity.InitializeDatabaseConnection("DefaultConnection", "UserProfile", "UserId", "UserName", autoCreateTables: true); 

मैं Application_Start में InitializeSimpleMembership चलाने के लिए होगा तो सबसे अच्छा होगा लगता है।

+2

यदि यह काम करता है तो आपको वेब.कॉन्फिग फ़ाइल में प्रदाताओं को स्पष्ट रूप से तार करने की आवश्यकता है। , Http://blog.longle.net/2012/09/25/seeding-users-and-roles-with-mvc4-simplemembershipprovider-simpleroleprovider-ef5-codefirst-and-custom-user-properties/ – RickAndMSFT

+0

धन्यवाद @RickAndMSFT देखें मैंने एक बार अपनी वेब में सदस्यता और भूमिका प्रदाताओं को संपादित करने की जांच की। कॉनफिग फ़ाइल, लेकिन सिंटैक्स के बारे में जानकारी बहुत मुश्किल होनी चाहिए। –

+0

मुझे एक समान समस्या का सामना करना पड़ा है - त्रुटि संदेश SQL सर्वर से कनेक्शन स्थापित करते समय नेटवर्क से संबंधित या उदाहरण-विशिष्ट त्रुटि उत्पन्न हुई थी। सर्वर नहीं मिला था या पहुंच योग्य नहीं था। सत्यापित करें कि इंस्टेंस नाम सही है और SQL सर्वर दूरस्थ कनेक्शन की अनुमति देने के लिए कॉन्फ़िगर किया गया है। (प्रदाता: एसक्यूएल नेटवर्क इंटरफेस, त्रुटि: 26 - सर्वर/इंस्टेंस निर्दिष्ट करने में त्रुटि निर्दिष्ट)। – Will

4

यहाँ एक tutorial है कि आप स्थापना के लिए एक SQL डेटाबेस का पालन कर सकता है जब विंडोज Azure पर अपने आवेदन की तैनाती है। आपको अपने web.config में सही कनेक्शन स्ट्रिंग सेट करनी होगी जो डिफ़ॉल्ट रूप से स्थानीय टेम्पलेट का उपयोग करते हुए एक नया एएसपी.नेट एमवीसी 4 एप्लिकेशन बनाते समय स्थानीय SQL एक्सप्रेस डेटाबेस पर इंगित कर रहा है।

आपका एसक्यूएल Azure कनेक्शन स्ट्रिंग कुछ इस तरह दिखेगा:

<connectionStrings> 
    <add name="DefaultConnection" connectionString="Data Source=tcp:#server#.database.windows.net,1433;Initial Catalog=#DBName#;User ID=UserName#@#server#;Password=#password#;MultipleActiveResultSets=True" providerName="System.Data.SqlClient"/> 
</connectionStrings> 
+2

धन्यवाद पुश करने के लिए की जरूरत है, लेकिन वहाँ मेरी कनेक्शन स्ट्रिंग के साथ कोई समस्या नहीं है। एक बार जब मैं अपने ब्राउज़र में कुकीज़ हटा देता हूं, तो साइट ठीक काम करती है। सभी डेटा वहां हैं, सभी उपयोगकर्ता लॉगिन और भूमिकाएं हैं। प्रकाशित होने के बाद यह पहली पहुंच है जो गलत हो जाती है। –

+0

ठीक है तो मुझे वास्तव में यह समझना होगा कि समस्या क्या हो सकती है। मैंने जो ट्यूटोरियल लिंक किया है उसका पालन करने का प्रयास करें। –

+0

हाँ, मुझे लगता है कि कोशिश की और यह मुझे इस स्थापित करने के लिए नेतृत्व: http://nuget.org/packages/Microsoft.AspNet.Providers.LocalDB, लेकिन वह सब कुछ तोड़ दिया, इस सूत्र http में चर्चा की त्रुटि पैदा: // सामाजिक। msdn.microsoft.com/forums/pl-pl/windowsazuredevelopment/thread/d352bb1b-577c-42b7-8872-5ed59cd65f32 –

1

हालांकि इस प्रश्न का उत्तर दिया गया है, मैंने सोचा कि मैं अपने अनुभवों को एक ही समस्या के साथ जल्दी से साझा कर सकता हूं। मेरा मामला मार्क के लिए थोड़ा अलग है।

तो, मेरे पास मेरे सभी नियंत्रकों पर InitializeSimpleMembership विशेषता थी (वास्तव में मेरे पास यह मेरे मूल नियंत्रक पर था जिसमें से मेरे सभी नियंत्रक उत्तराधिकारी थे), हालांकि मुझे अभी भी एक ही समस्या का सामना करना पड़ रहा था। अब, मेरे बेस कंट्रोलर में मैं हमारे आवेदन के लिए कुछ संदर्भ जानकारी सेट अप करने के लिए Initialize विधि को ओवरराइड कर रहा था। इस संदर्भ सेटअप का एक हिस्सा यह जांचना है कि वर्तमान उपयोगकर्ता किसी विशेष भूमिका में है या नहीं, इसलिए IsUserInRole विधि को इस Initialize विधि के भीतर से कॉल किया जा रहा था, इससे पहले कि कोई भी क्रिया विधि कहा जा रहा हो।

अब

अगर एक InitializeSimpleMembership वर्ग एक देखती है कि प्रारंभ करने वास्तव में OnActionExecuting विधि से किया जाता है पर एक नज़र लेता है (यानी ActionFilterAttribute से InitializeSimpleMembership inherits):

public override void OnActionExecuting(ActionExecutingContext filterContext) 
{ 
     // Ensure ASP.NET Simple Membership is initialized only once per app start 
     LazyInitializer.EnsureInitialized(ref _initializer, ref _isInitialized, ref _initializerLock); 
} 

मेरे मामले में, इस सदस्यता प्रारंभ हो रहा था बहुत देर हो चुकी ... जो है, मैं साधारण सदस्यता की जरूरत है इससे पहले कि मैं अपने आधार नियंत्रक के ओवरराइड Initialize विधि में IsUserInRole करने के लिए अपने फोन करना प्रारंभ किया जाना है।

मेरे लिए समाधान अपेक्षाकृत आसान था: मैं हटा दिया InitializeSimpleMembership पूरी तरह से विशेषता और सीधे मेरी आधार नियंत्रक में अपने तर्क रखा ताकि मैं अपने Initialize विधि से यह कह सकते हैं, कुछ इस तरह: अब

public class BaseController : Controller 
{ 
    private static SimpleMembershipInitializer _initializer; 
    private static object _initializerLock = new object(); 
    private static bool _isInitialized; 

    private class SimpleMembershipInitializer 
    { 
     public SimpleMembershipInitializer() 
     { 
      try 
      { 
       WebSecurity.InitializeDatabaseConnection("DefaultConnection", "UserProfile", "UserId", "UserName", autoCreateTables: true); 
      } 
      catch (Exception ex) 
      { 
       throw new InvalidOperationException("The ASP.NET Simple Membership database could not be initialized. For more information, please see http://go.microsoft.com/fwlink/?LinkId=256588", ex); 
      } 
     } 
    } 

    ... 

    protected override void Initialize(RequestContext requestContext) 
    { 
     base.Initialize(requestContext); 
     LazyInitializer.EnsureInitialized(ref _initializer, ref _isInitialized, ref _initializerLock); 
     SetupControllerContext(); // my function that calls 'IsUserInRole' 
    } 
} 

मुझे कल्पना है कि किसी को शायद इसे पुनः प्रतिक्रिया देना चाहिए और इसे Application_Start() विधि में डालना चाहिए, जैसा मार्क ने सुझाव दिया था, लेकिन आपको विचार मिलता है :)। मैं बस अपने अनुभव को समझाना चाहता था अगर कोई अपने नियंत्रक के ओवरराइड Initialize विधि में कुछ ऐसा कर रहा हो।