7

我有一个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 时它会等待。其他时候,它会立即将该值报告为“假”。

4

3 回答 3

13

根据您的评论,您似乎没有为您的站点明确配置角色提供程序。

如果您的 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 /> 元素将删除之前为该类型定义的所有提供程序。

于 2009-09-09T23:01:22.693 回答
1

当您AttachDBFilename在连接字符串中指定选项时,您实际上是在询问您自己的即时配置 SQL Server 实例,也就是“用户实例”。此实例是通过要求“主”实例(.\SQLEXPRESS 实例)提供子实例来创建的,这意味着将主/模型/msdb 复制到您的配置文件中,在您配置为使用新复制的 master/model/msdb,然后要求此“子”实例将指定的“文件”附加为新数据库。SQL Server 2005 Express Edition 用户实例中解释了详细信息。

创建子实例的过程非常脆弱,当它中断数据库调用时,最终会导致打开连接时出现超时错误。在您的情况下,似乎该过程在某些情况下会中断(当您到达站点的受保护部分时)。如果没有适当的信息,很难猜测它为什么会中断。查看链接文章中的常见问题,看看是否适用于您。还要检查系统事件日志,了解为什么子实例无法启动或无法打开 MDF 文件的任何消息。请注意,一个常见的错误是在不同凭据下使用 AttachDBFilename 请求相同的物理文件:每个凭据将启动其自己的“子”实例,并且只有第一个会成功附加所需的数据库。

于 2009-09-09T22:30:33.243 回答
0

我有同样的问题,这是由于 sql server 的服务被禁用。

检查 services.msc 以查看 sqlexpress 服务是否正在运行。如果是检查你的机器上是否安装了 sql express

于 2013-05-13T16:16:20.483 回答