【发布时间】:2015-04-09 13:16:00
【问题描述】:
我们有一个 Azure 云应用程序,它将用户登录(会员)信息存储到 Azure SQL 数据库中。我们有这个数据库的多个版本,一个用于生产,一个用于开发。我们希望我们的开发数据库向世界开放,生产仅限于 Azure 云应用程序。 虽然数据库向世界开放,但一切正常。但是,在我修改 Azure SQL 中的服务器级防火墙规则以限制允许的 IP,不包括我家计算机的 IP,并添加一个允许家庭计算机 IP 的数据库级规则后,Membership 停止工作。 现在,我可以使用 Microsoft SQL Management Studio 从家里访问数据库,甚至可以使用 Visual-Studio Server Explorer(它使用 web.api 中的 connectionString)连接到它。但是,Membership 不再允许从家里连接到数据库。 Membership.GetUser() 返回:
{System.Data.SqlClient.SqlException (0x80131904):无法打开登录请求的服务器“XXXXXX”。不允许 IP 地址为“XXX.XXX.59.158”的客户端访问服务器。要启用访问,请使用 Windows Azure 管理门户或在 master 数据库上运行 sp_set_firewall_rule 来为此 IP 地址或地址范围创建防火墙规则。此更改最多可能需要五分钟才能生效。 用户“visualbee”登录失败。 已为该会话分配了跟踪 ID“23e9447b-f169-49ab-88df-305172323803”。当您需要帮助时,将此追踪 ID 提供给客户支持。
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>
数据库级防火墙规则:(如您所见,它排除了任何人)
【问题讨论】:
-
您在 web.config 中的 connectionStrings 中有多少个连接字符串?你能在web.config中发布membership和roleManager标签吗?
-
可能你有动态IP?或者您可以在实时模式下通过 webmatrix 检查连接字符串?
-
您的描述有点令人困惑...问题是部署到 Azure 的 Web 应用程序还是在本地开发机器(在家)上以调试模式运行的同一应用程序的问题?动态 IP 分配可能是一个问题 - 您可以通过 SSMS 进行连接,但不能通过您的代码进行连接。我在 4G 热点上遇到过这种确切的行为,其中每个呼叫都来自被 Azure SQL DB 防火墙阻止的一系列 IP 地址。
-
感谢您的评论。 Win:我在帖子中添加了 members 和 roleManager 标签。我在 web.config 中确实有几个其他连接字符串,但是查看 MemberShip 结构,我发现它确实试图访问当前数据库。 brykneval:我有一个静态 IP,与错误消息报告的 IP 相同,它说该 IP 被服务器阻止。您还可以在我添加到帖子中的数据库级规则中看到,所有 IP 都应该是可访问的。 Simon W - 它在我的本地机器上不起作用,但正如我写信给 brykneval 时,这应该不是问题。
标签: asp.net azure asp.net-membership azure-sql-database firewall