成员资格不适用于 Azure SQL 数据库级防火墙

Membership not working with Azure SQL database-level firewall

我们有一个 Azure 云应用程序,它将用户登录(会员资格)信息存储到 Azure SQL 数据库中。我们有这个数据库的多个版本,一个用于生产,一个用于开发。我们希望我们的开发数据库向全世界开放,而生产仅限于 Azure 云应用程序。 虽然数据库向世界开放,但一切都运行良好。但是,在我修改 Azure SQL 中的服务器级防火墙规则以限制允许的 IP(不包括我家用计算机的 IP)并添加允许家用计算机 IP 的数据库级规则后,成员资格停止工作. 现在,我可以在家中使用 Microsoft SQL Management Studio 访问数据库,甚至可以使用 Visual-Studio Server Explorer(使用来自 web.api 的 connectionString)连接到它。但是,会员资格不再允许从家中连接到数据库。 Membership.GetUser() returns:

{System.Data.SqlClient.SqlException (0x80131904): Cannot open server 'XXXXXX' requested by the login. Client with IP address 'XXX.XXX.59.158' is not allowed to access the server. To enable access, use the Windows Azure Management Portal or run sp_set_firewall_rule on the master database to create a firewall rule for this IP address or address range. It may take up to five minutes for this change to take effect. Login failed for user 'visualbee'. This session has been assigned a tracing ID of '23e9447b-f169-49ab-88df-305172323803'. Provide this tracing ID to customer support when you need assistance.

web.config中定义的数据库连接字符串为:

<add name="usersDB" connectionString="data source=XXXX.database.windows.net;Initial Catalog=XXX.YYY.UsersDatabase;User ID=uuu@gggg;Password=pppppp;Encrypt=true;Trusted_Connection=false;MultipleActiveResultSets=True" providerName="System.Data.SqlClient" />

来自 web.config 的成员资格和 RoleManager 定义:

<membership defaultProvider="DefaultMembershipProvider" hashAlgorithmType="SHA1">
  <providers>
    <clear />        
    <add name="DefaultMembershipProvider" type="System.Web.Providers.DefaultMembershipProvider, System.Web.Providers, Version=1.0.0.0, Culture=neutral, PublicKeyToken=XXbf3856ad364eXX" connectionStringName="usersDB" enablePasswordRetrieval="false" enablePasswordReset="true" requiresQuestionAndAnswer="false" requiresUniqueEmail="false" maxInvalidPasswordAttempts="2147483647" minRequiredPasswordLength="6" minRequiredNonalphanumericCharacters="0" passwordAttemptWindow="10" applicationName="/" />        
  </providers>
</membership>

<roleManager enabled="false" defaultProvider="DefaultRoleProvider">
  <providers>
    <clear />
    <add name="AspNetWindowsTokenRoleProvider" type="System.Web.Security.WindowsTokenRoleProvider" applicationName="/" />        
    <add name="DefaultRoleProvider" type="System.Web.Providers.DefaultRoleProvider, System.Web.Providers, Version=1.0.0.0, Culture=neutral, PublicKeyToken=XXbf3856ad364eXX" connectionStringName="usersDB" applicationName="/" />        
  </providers>
</roleManager>

数据库级防火墙规则:(如你所见,它排除了任何人)

我终于通过实验找到了解决办法。 我向 'System-Databases' 数据库添加了一个数据库级规则:

exec sp_set_database_firewall_rule N'AllowAll','0.0.0.0','255.255.255.255'

现在我可以使用成员资格连接到用户数据库。其他具有适当数据库级防火墙规则的数据库也可公开访问。其余数据库 return 一个 "Client with IP address XXX is not allowed to access the server".