【问题标题】:using roles in asp.net with windows authentication在带有 Windows 身份验证的 asp.net 中使用角色
【发布时间】:2017-05-12 20:27:23
【问题描述】:

我需要使用 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 Role Provider 授予对 Web 应用程序中 MVC 控制器的访问权限。您还可以使用返回布尔类型的 User.IsInRole 方法(字符串)显示/隐藏视图的各个部分。

标签: c# asp.net asp.net-mvc windows-authentication security-roles


【解决方案1】:

这是一个使用 Windows 身份验证和 SQL Server 角色提供程序的工作示例 ASP.NET MVC 4 应用程序。

&lt;system.web&gt; 部分下的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 Role Provider,所以我们需要一个存储用户和角色的数据库。要创建数据库,请使用 aspnet_regsql.exe 命令(在我的 windows 10 pro 机器上,它位于 C:\Windows\Microsoft.NET\Framework\v4.0.30319 下),它允许创建包含用户和角色的架构。

注意:通过此工具创建架构时,请确保数据库名称与 web.config 文件中的连接字符串中给出的名称相同(接下来会介绍)。

回到web.config文件添加连接字符串

 <connectionStrings>    
    <add connectionString="DATA SOURCE = PersonalLaptop\SQLEXPRESS2014; INITIAL CATALOG = AspNetMembership; INTEGRATED SECURITY = SSPI;"
          name="AspNetMembershipConnString" providerName="System.Data.SqlClient"/>
  </connectionStrings>

确保连接字符串的名称与 sql 角色提供程序部分中的名称相同。

注意:您不需要会员提供程序,因为您使用的是集成 Windows 身份验证模式。

创建角色并添加用户

有两种方法可以做到这一点。

1) 打开aspnet_regsql.exe 创建表和存储过程的SQL 数据库。在aspnet_Usersaspnet_Applicationsaspnet_UsersInRolesaspnet_Roles 表中创建新记录。由于您使用的是 windows 身份验证,因此请确保在 aspnet_Users 表中添加 windows 用户名(完全限定域名/本地用户名)。

2) 在 HomeController 的 Index 方法中使用代码:

Roles.CreateRole("SuperDuperUsers");
Roles.AddUserToRole("<WindowsUserName>", "SuperDuperUsers");

这将创建角色,并将为您将用户添加到该角色中。

我已经在 github 上为您上传了示例 asp.net mvc 4 应用程序here

在 github 存储库中,SqlScriptOfTheDatabase.sql 文件包含为存储用户和角色及其关系而创建的架构。您可以使用它而不是使用 aspnet_regsql.exe 命令,如果你想的话。

希望这会有所帮助!

【讨论】:

  • 感谢您非常彻底的回答。我希望我们的 IT 人员可以通过活动目录管理组。有没有办法设置数据库,以便在 AD 发生变化时更新它?
  • @user3839756 欢迎您!由于您希望根据您在 web.config 文件中定义的角色来限制对 Web 应用程序某些部分的访问,因此它必须是一项手动工作。设置 AD 组后,您可以将组分配给特定角色,该角色将在您的 Web 应用程序中具有特定访问权限。 AD 组和角色的映射必须手动完成,因为业务将决定哪些部门可以查看或编辑应用程序的哪些部分。希望这是有道理的。
猜你喜欢
  • 1970-01-01
  • 2010-09-22
  • 1970-01-01
  • 2013-03-15
  • 1970-01-01
  • 2010-10-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多