Asp.net

為使用 AspNetSqlMembershipProvider 的站點獲取“SQLExpress 數據庫文件自動創建錯誤”,但連接字元串是 SQL Server 2005

  • June 22, 2018

我有一個ASP.NET v2.0根目錄是公共的網站(不是 Web 應用程序),但“Admin”子目錄需要身份驗證。有關設置的所有內容都非常通用 - 我使用了根 web.config 和標準AspNetSqlMembershipProvider提供程序中定義的連接字元串,並且我使用的是 ASP.NET 登錄控制項。

Admin 目錄中的 web.config 指定使用者必須具有“Admin”角色。

我正在使用SQL Server 2008,我的連接字元串很好;每個根級頁面都是數據驅動的,它們都可以正常工作。

提供者配置似乎不錯。

當我登錄時,登錄控制項的“ OnLoggedIn”事件會觸發。

該事件程式碼中的最後一行將我重定向到我的Admin/Default.aspx頁面。我在“OnLoggedIn”中的斷點顯示一切都很好,直到重定向到我的管理目錄……然後……

……然後我等待……等待……

然後我得到一個錯誤,告訴我它經歷了一個“ SQLExpress database file auto-creation error。”

為什麼它會突然嘗試創建 SQL Server Express 文件?為什麼它突然忽略了我的連接字元串?

一個奇怪的線索:就在“OnLoggedIn”事件的最後一行之前,我輸入了這個:

bool blnTest = User.IsInRole("Admin");

我想看看是否blnTest = true

發生的事情是該程序到達這條線……並等待……最終告訴我它無法訪問 SQL Server Express 數據庫。似乎任何用於確定使用者角色的參考(無論是在我的程式碼中還是在幕後)都呼叫了錯誤的數據庫。

編輯:啊,有時當我測試 blnTest 時它會等待。其他時候,它會立即將該值報告為“假”。

根據您的評論,您似乎沒有為您的站點明確配置角色提供程序。

如果您的 web.config 中的所有內容是:

<roleManager enabled="true" />

然後,您將依賴在配置層次結構中進一步聲明的預設提供程序(machine.config、全域 web.config 等)

在 machine.config 中,你可能有類似的東西:

<roleManager>
 <providers>
   <add name="AspNetSqlRoleProvider" 
     connectionStringName="LocalSqlServer" 
     applicationName="/" 
     type="System.Web.Security.SqlRoleProvider, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"/>
   <add name="AspNetWindowsTokenRoleProvider" 
     applicationName="/" 
     type="System.Web.Security.WindowsTokenRoleProvider, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"/>
 </providers>
</roleManager>

如您所見,第一個提供程序被配置為使用名為 LocalSqlServer 的連接字元串——它通常也在 machine.config 中聲明:

<add name="LocalSqlServer" 
    connectionString="data source=.\SQLEXPRESS;Integrated Security=SSPI;AttachDBFilename=|DataDirectory|aspnetdb.mdf;User Instance=true" 
    providerName="System.Data.SqlClient"/>

這旨在使用基於本地文件的數據庫,如果它尚不存在,則將創建該數據庫。

因此,要讓角色在您的站點上工作,您應該將您的根 web.config 修改為:

<roleManager enabled="true">
 <providers>
   <clear />
   <add name="AspNetSqlRoleProvider" 
     connectionStringName="YourConnectionStringName" 
     applicationName="/" 
     type="System.Web.Security.SqlRoleProvider, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"/>
 </providers>
</roleManager>

使用 <clear /> 元素將刪除之前為該類型定義的所有提供程序。

引用自:https://stackoverflow.com/questions/1402430