7 asp.net provider sql-server-express sql-server-2008
我有一个ASP.NET v2.0网站(不是Web应用程序),根目录是公共的,但"Admin"子目录需要身份验证.关于设置的一切都非常通用 - 我使用了根web.config和标准AspNetSqlMembershipProvider提供程序中定义的连接字符串,我正在使用ASP.NET Login控件.
Admin目录中的web.config指定用户必须具有"Admin"角色.
我正在使用SQL Server 2008,我的连接字符串很好; 每个根级页面都是数据驱动的,它们都可以正常工作.
提供商配置似乎很糟糕.
当我登录时,登录控件的" OnLoggedIn"事件触发.
该事件代码中的最后一行将我重定向到我的Admin/Default.aspx页面.我在"OnLoggedIn"中的断点向我展示了一切顺利,直到重定向到我的Admin目录......然后......
......等我......等等......
然后我收到一个错误,告诉我它经历了" SQLExpress database file auto-creation error."
为什么在世界上它突然尝试创建一个SQL Server Express文件?为什么突然忽略我的连接字符串?
一个奇怪的线索:就在"OnLoggedIn"事件的最后一行之前,我把它放在:
bool blnTest = User.IsInRole("Admin");
Run Code Online (Sandbox Code Playgroud)
我想看看是否blnTest = true.
会发生什么,这个过程会遇到这一行...并等待...并最终告诉我它无法访问SQL Server Express数据库.似乎任何引用(在我的代码中或在幕后)确定用户的角色,都会调用错误的数据库.
编辑:唉,有时它等我测试blnTest.其他时候,它会立即将该值报告为"false".
Zha*_*uid 12
根据您的评论,您似乎没有为您的网站明确配置角色提供程序.
如果你的web.config中的所有内容是:
<roleManager enabled="true" />
Run Code Online (Sandbox Code Playgroud)
然后你依赖于在配置hieracrchy(machine.config,global 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>
Run Code Online (Sandbox Code Playgroud)
如您所见,第一个提供程序配置为使用名为LocalSqlServer的connectionString - 它通常也在machine.config中声明:
<add name="LocalSqlServer"
connectionString="data source=.\SQLEXPRESS;Integrated Security=SSPI;AttachDBFilename=|DataDirectory|aspnetdb.mdf;User Instance=true"
providerName="System.Data.SqlClient"/>
Run Code Online (Sandbox Code Playgroud)
这旨在使用基于本地文件的数据库,如果该数据库尚不存在,将创建该数据库.
因此,要让角色在您的网站上运行,您应该将您的根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>
Run Code Online (Sandbox Code Playgroud)
使用<clear />元素将删除该类型的所有先前定义的提供程序.