在 asp.net 中使用角色与 Windows 身份验证



我需要使用 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_Usersaspnet_Applicationsaspnet_UsersInRolesaspnet_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命令。

希望这有帮助!

相关内容

  • 没有找到相关文章

最新更新