我需要使用 Roles.GetUsersInRole(role) 方法来获取在事件发生时应该收到电子邮件的用户名。 我正在使用 Windows 身份验证。
在我的网络配置中:
<system.web>
<authentication mode="Windows" />
<identity impersonate="false" />
<roleManager enabled="true"
defaultProvider="AspNetWindowsTokenRoleProvider"/>
...
</system.web>
一切都编译正常,但是当我调用该方法时,我收到此错误:
{"配置的角色提供程序 (WindowsTokenRoleProvider) 依赖于 Windows 身份验证来确定允许用户成为其成员的组。ASP.NET 角色管理器不能用于管理 Windows 用户和组。如果要支持自定义用户/角色分配,请使用 SQLRoleProvider。
这是配置问题吗? 我需要继续使用 Windows 身份验证,但是我还需要能够从组中获取用户名。
如果没有配置设置来完成此操作,是否有任何解决方法可以让我获得此功能?
谢谢
下面是使用SQL Server 角色提供程序的 Windows 身份验证 ASP.NET MVC 4 应用程序的工作示例。
在"<system.web>
"部分下的web.config
文件中:
<roleManager enabled="true" defaultProvider="SqlRoleProvider">
<providers>
<add name ="SqlRoleProvider"
type="System.Web.Security.SqlRoleProvider"
connectionStringName="AspNetMembershipConnString"
applicationName="MembershipAndRoleProviderSample"/>
</providers>
</roleManager>
这会告知 asp.net 运行时使用 Sql 角色提供程序,并指示用于查找数据库的连接字符串。
由于我们使用的是 SQL 角色提供程序,因此我们需要一个存储用户和角色的数据库。要创建数据库,请使用aspnet_regsql.exe
命令(在我的 Windows 10 专业计算机上,它在 C:\Windows\Microsoft.NET\Framework\v4.0.30319 下),该命令允许创建包含用户和角色的架构。
注意:通过此工具创建架构时,请确保数据库名称与 web.config 文件(接下来推出)的连接字符串中给出的名称相同。
返回到 web.config 文件,添加连接字符串
<connectionStrings>
<add connectionString="DATA SOURCE = PersonalLaptopSQLEXPRESS2014; INITIAL CATALOG = AspNetMembership; INTEGRATED SECURITY = SSPI;"
name="AspNetMembershipConnString" providerName="System.Data.SqlClient"/>
</connectionStrings>
确保连接字符串的名称与 sql 角色提供程序部分中的名称相同。
注意:您不需要成员资格提供程序,因为您使用的是集成 Windows 身份验证模式。
创建角色并添加用户
有两种方法可以做到这一点。
1)打开 SQL 数据库,aspnet_regsql.exe
在其中创建了表和存储过程。在aspnet_Users
、aspnet_Applications
、aspnet_UsersInRoles
和aspnet_Roles
表中创建新记录。由于您使用的是 Windows 身份验证,因此请确保在aspnet_Users
表中添加 windows 用户名(完全限定域名/本地用户名)。
2)在 HomeController 的 Index 方法中,使用以下代码:
Roles.CreateRole("SuperDuperUsers");
Roles.AddUserToRole("<WindowsUserName>", "SuperDuperUsers");
这将创建角色,并将用户添加到该角色中。
我已经在 github 上上传了示例 asp.net mvc 4 应用程序。
在 github 存储库中,SqlScriptOfTheDatabase.sql 文件包含为存储用户和角色及其关系而创建的架构。您可以使用它而不是使用 如果需要,aspnet_regsql.exe
命令。
希望这有帮助!