在 asp 中用于 Windows 身份验证的简单自定义角色。网?

Posted

技术标签:

【中文标题】在 asp 中用于 Windows 身份验证的简单自定义角色。网?【英文标题】:Simple custom roles for windows authentication in asp. net? 【发布时间】:2012-05-08 16:01:25 【问题描述】:

在我们的公司网络中,Active Directory(AD) 中的角色未正确分配给我的应用程序。所以我在我的数据库中创建了一个简单的表,映射了 AD 中的所有用户及其角色。此表中实际上只有两列,用户和角色。

我希望利用asp.net中强大的角色管理功能,我想使用[Authorize(Roles = "Managers")]这样的功能。有没有一种简单的方法来使用这些自定义角色而无需设置复杂的角色和成员资格提供者?

应用背景: sql server, linq, asp.net mvc

【问题讨论】:

在我在 KitsulaRoleProvider.cs 中添加所有“未实现的方法”之前,文章“MVC 的自定义角色提供程序”中的解决方案不起作用,否则我收到错误消息:不实现继承的抽象会员 【参考方案1】:

实现自定义角色提供者真的很容易。基本上你需要实现两个函数。

看文章:Custom Role Provider for MVC

【讨论】:

虽然此链接可能会回答问题,但最好在此处包含答案的基本部分并提供链接以供参考。如果链接页面发生更改,仅链接的答案可能会失效。【参考方案2】:

Article provided in the event the website goes down.

用于 MVC 的自定义角色提供程序

在之前的文章中,我解释了如何创建自定义成员资格提供程序来授权用户并保护控件和页面。但是,如果您想为特定的用户组显示或保护某些区域、控制器或页面怎么办?例如,只允许管理员访问管理面板。

在 .Net Framework 中用于此目的的是角色提供者。但同样,它使用自己的数据库存储用户角色。因此,让我们创建和配置将使用我们的数据库或任何其他存储的自定义角色提供程序。和以前一样,我们应该从 .NET 覆盖类:

对于最低限度的功能,我们需要实现和覆盖两个函数 GetRolesForUser 和 IsUserInRole。首先,一个用于获取所有用户角色(或组)的列表:

public override string[] GetRolesForUser(string username)

    using (DatabaseEntities db = new DatabaseEntities())
    
        User user = db.Users.FirstOrDefault(u => u.UserName.Equals(username, StringComparison.CurrentCultureIgnoreCase) || u.Email.Equals(username, StringComparison.CurrentCultureIgnoreCase));

        var roles = from ur in user.UserRoles
                    from r in db.Roles
                    where ur.RoleId == r.Id
                    select r.Name;
        if (roles != null)
            return roles.ToArray();
        else
            return new string[] ; ;
    

如您所见,我通过函数的用户名参数(在我的例子中可以是用户名或电子邮件)在我的数据库中定位用户并创建用户角色的字符串列表。

第二个功能是检查用户是否在角色(或组)中:

public override bool IsUserInRole(string username, string roleName)

    using (DatabaseEntities db = new DatabaseEntities())
    
        User user = db.Users.FirstOrDefault(u => u.UserName.Equals(username, StringComparison.CurrentCultureIgnoreCase) || u.Email.Equals(username, StringComparison.CurrentCultureIgnoreCase));

        var roles = from ur in user.UserRoles
                    from r in db.Roles
                    where ur.RoleId == r.Id
                    select r.Name;
        if (user != null)
            return roles.Any(r => r.Equals(roleName, StringComparison.CurrentCultureIgnoreCase));
        else
            return false;
    

然后我们需要在 web.config 文件中配置解决方案以使用创建的角色提供程序。出于调试目的,可能需要将 cacheRolesInCookie 设置为 false,否则行为将不可预测。

<system.web>
    <compilation debug="true" targetFramework="4.5.2" />
    <httpRuntime targetFramework="4.5.2" />
    <authentication mode="Windows" />
    <authorization>
        <deny users="?" />
    </authorization>
    <roleManager cacheRolesInCookie="true" defaultProvider="KitsulaRoleProvider" enabled="true">
        <providers>
            <clear />
            <add name="KitsulaRoleProvider" type="Kitsula.Security.KitsulaRoleProvider" />
        </providers>
    </roleManager>
</system.web>

现在您可以通过设置 Authorize 属性来保护具有指定角色的特定用户组的控制器、操作、页面:

using System;
using System.Web.Mvc;

namespace Kitsula.Areas.Admin.Controllers

    [Authorize(Roles = "Administrators")]
    public class HomeController : Controller
    
        //
        // GET: /Admin/Home/

        public ActionResult Index()
        
            return View();
        

    

【讨论】:

ASP 网络 WebFormswindows authentication 的自定义角色? 您将如何使用 Unity IOC 来实现这一点?

以上是关于在 asp 中用于 Windows 身份验证的简单自定义角色。网?的主要内容,如果未能解决你的问题,请参考以下文章

配置用于 ASP.Net 身份验证的数据库

ASP.NET MVC 4 (十三) 基于表单的身份验证

ASP.NET Core JWT/Windows 身份验证 HTTP 400 错误

带有 Windows 身份验证的 ASP.Net Core 3.1 中的空闲超时

ASP.NET Core Windows 身份验证和应用程序角色

ASP.NET Core 中的混合身份验证(Windows 和 AAD JwtBearer)