ASP.NET中的Windows身份验证如何实现简单的自定义角色?

16

在我们公司的网络中,Active Directory(AD)中的角色分配不适用于我的应用程序。所以我在我的数据库中创建了一个简单的表格,将AD中所有用户及其角色进行了映射。这个表格只有两列,用户和角色。

我希望能够利用 asp.net 中强大的角色管理功能,例如使用[Authorize(Roles = "Managers")]等特性。有没有一种简单的方法可以使用自定义角色而不设置复杂的角色和成员提供程序?

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


1
从文章“MVC的自定义角色提供程序”中得到的解决方案在我添加了KitsulaRoleProvider.cs中的所有“未实现方法”之后才起作用。 否则,我会收到一个错误,指出: 未实现继承的抽象成员。 - Candice
2个回答

12

13
虽然这个链接可能回答了问题,但最好在这里包含答案的关键部分并提供链接作为参考。仅有链接的答案如果链接页面发生变化就可能变得无效。 - Fedor

8

如果网站崩溃,可以提供此文章。

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.net的WebForms中,如何为Windows身份验证创建自定义角色? - Kiquenet
你会如何使用Unity IOC来实现这个? - Joe Ricklefs

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接