在配置使用Membership或其他的Providers的ASP.NET2.0時一定要設定applicationName屬性

來源:互聯網
上載者:User

在配置使用Membership或其他的Providers的ASP.NET2.0時一定要設定applicationName屬性
原文:Always set the "applicationName" property when configuring ASP.NET 2.0 Membership and other Providers
作者:Scott Guthrie
翻譯:範維肖
注釋:對於個別名詞保留英文描述或翻譯參考。

情境
在本地開發一個asp.net2.0的應用程式時使用了Membership、Roles或Profile特性。你建立了一些新使用者,一切都沒有問題。

然後把這個程式copy到遠程伺服器(remote server)上(或者只是移動到你本機伺服器上的其他目錄)然後運行。由於某種原因,雖然我們能夠串連到membership資料庫,但是當登陸的時候就會出現錯誤了,它並不拋出串連錯誤(connection error),而是提示你像類似的錯誤:“嘗試登陸失敗,請重試”(Login attempt unsuccessful, please try again)

原因
這種經常出現的錯誤的原因是因為membership(或者是roles、profile) provider已經被加入到了程式的web.config裡了。但是applicationName屬性(attribute)並沒有被指定(假設下面的代碼的粗體部分布存在地話)

<membership>

            <providers>

                <clear/>

                <add name="AspNetSqlMembershipProvider"

                    type="System.Web.Security.SqlMembershipProvider, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"

                    connectionStringName="LocalSqlServer"

                    enablePasswordRetrieval="false"

                    enablePasswordReset="true"

                    requiresQuestionAndAnswer="true"

  requiresUniqueEmail="false"

                    passwordFormat="Hashed"

                    maxInvalidPasswordAttempts="5"

                    minRequiredPasswordLength="7"

                    minRequiredNonalphanumericCharacters="1"

                    passwordAttemptWindow="10"

                    passwordStrengthRegularExpression="" 

                     applicationName ="/" 

                />

            </providers>

      </membership>

如果applicationName屬性沒有被配置的話,當往程式的資料庫裡添加資料的時候,asp.net會使用程式在web伺服器裡的虛擬目錄路徑(vroot Path)自動的計算applicationName的值。我們開啟aspnetdb資料庫,看aspnet_Applications表,就能瞭解這一行為:


這個表裡為每個applicationName儲存了一個具有唯一值(unique)的ApplicationID。因為在我們的程式裡註冊一個使用者的時候並沒有指定一個applicationName屬性,所以它自動的被設定(計算)為/website8(早期建立項目時的名字)

然後,使用membership API建立的使用者會與ApplicationID相關聯,這樣可以找到applicationName(and in turn the applicationName)。【這樣做的目的可以讓我們的多個應用程式和網站使用同一個資料庫】。開啟aspnet_Users表就可以可以看到這些。


如果把這個程式配置成運行在/website8虛擬目錄下那麼一切都沒有問題。但是如果它被copy到其他的地方或伺服器上並且更換了虛擬路徑(比如說“/app1”或更通常被設定的“/”)後,當Membership APIs被使用時他們就“看”不到資料庫裡已有的使用者了——因為他們將會使用一個不同的applicationName去資料庫裡尋找使用者,相應地過濾application_Users表中的使用者。這就是為什麼會出現上面錯誤的原因。

如何解決這個問題
最簡單的辦法是開啟ASPNETDB資料庫中的aspnet_Users和aspnet_Application表,去“回想”(figure out,因為那時候我們的虛擬目錄叫什麼名字我們恐怕已經忘了)建立使用者和其他資料的時候的程式名稱(去aspnet_Application表中尋找)

然後開啟你的web.config檔案,添加一個applicationName屬性到provider聲明的地方並且給他賦值,例如,下面的代碼我們把它設定為在aspnet_Application表存在的/website8:

<membership>

            <providers>

                <clear/>

                <add name="AspNetSqlMembershipProvider"

                    type="System.Web.Security.SqlMembershipProvider, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"

                    connectionStringName="LocalSqlServer"

                    enablePasswordRetrieval="false"

                    enablePasswordReset="true"

                    requiresQuestionAndAnswer="true"

  requiresUniqueEmail="false"

                    passwordFormat="Hashed"

                    maxInvalidPasswordAttempts="5"

                    minRequiredPasswordLength="7"

                    minRequiredNonalphanumericCharacters="1"

                    passwordAttemptWindow="10"

                    passwordStrengthRegularExpression="" 

                    applicationName="/website8" 

                />

            </providers>

      </membership>

這樣程式就能正常的工作,無論我們部署這個程式到那個虛擬目錄。

當然,我們還要保證Roles、Profile、WebPartPersonalization或其他的我們配置的providers也要被配置了。

這樣我們的程式可以正常工作了。

如果在一開始就避免它:
避免這個問題的最好的辦法是始終設定applicationName的值。一個比較好的預設值是使用“/”。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.