0

很抱歉这个基本问题,第一次在 C# 中使用 Web MVC4 ...

我正在为我用 C#/SQL 编写的应用程序创建一个 Web 界面。我已经能够将 MVC4 框架附加到 SQL DB。现在我想根据 AD 中的组成员身份来确保人们可以做什么。我的 web.config 中的身份验证设置为“Windows”,它正确显示了我登录时使用的 User.Identity.Name。所以我知道它正在拉起当前登录的用户。此外,对于 android 或 ipad 设备,我需要能够验证活动目录域之外的用户。不过,我还没有走那么远……在大多数情况下,如果可能,我想自动验证登录用户,然后提示输入用户名/密码(如果不存在)。

好的,我也已经知道如何在 AD 中为用户提取组成员身份。但是我需要运行该 AD 查询并将该信息存储在可以在每个页面上访问的某个位置。然后在每个页面上我如何访问该变量?

例如,如果他们无权访问菜单选项,我不想显示它,因此需要使用变量来显示或不显示受保护的菜单选项。另外,我认为我还需要在网页上添加该安全性,这样如果有人试图手动访问那里,他们就无法访问。

我假设出于安全原因我不想使用会话变量..

在过去使用 Adob​​e Flex 时,我使用单例来管理会话状态。我在那里进行了搜索,人们说这在 C# 中可能不是一个好主意。反正这样的例子不多。。。

你在做什么?

4

1 回答 1

0

这是我推荐的。开始寻找ActiveDirectoryMembershipProvider 类的示例。这个 MembershipProvider 与Forms Authentication相结合将为您提供一个安全的系统来验证用户。

一旦通过身份验证,您需要通过将Active Directory 角色提供程序 (ADRP)(用于确定用户组)与保护 MVC 应用程序的标准方法相结合来授权您的用户访问资源。

为了让您开始,我创建了这些简单的扩展方法,您可以扩展以使用 ADRP(因为我没有使用 ADRP)。

public static class IPrincipalExtensions
{
        private static _adminName = "Administrator";

    public static bool IsAnonymous(this IPrincipal instance)
    {
        return (instance == null);
    }

    public static bool IsAdminOrInRole(this IPrincipal instance, string role)
    {
        if (instance == null
            || instance.Identity == null
            || !instance.Identity.IsAuthenticated)
        {
            return false;
        }

        bool result = instance.IsInRole(role)
                      || instance.IsInRole(IPrincipalExtensions._adminName));

        return result;
    }

}

然后我还扩展了默认的AuthorizeAttibute给我一个只能用于管理员的属性:

public class AuthorizeAdministratorAttribute : AuthorizeAttribute
{
    protected override bool AuthorizeCore(HttpContextBase httpContext)
    {
        if (httpContext == null)
        {
            throw new ArgumentNullException("httpContext");
        }

        bool result = false;
        IPrincipal user = httpContext.User;

        if (user.Identity.IsAuthenticated)
        {
            result = user.IsAdmin();
        }

        return result;
    }
}

这使用了我提供的相同的扩展方法,IPrincipalExtensions所以我不再重复自己。有些人可能会觉得这有点矫枉过正,因为以下两行是相等的:

[Authorize("Administrator")]
[AuthorizeAdministrator]

但是,由于第一个示例使用的是字符串,因此一个简单的错误类型会拒绝访问,如果我决定将角色/组名称更改为“Admins”,则变得更加困难。因此,如果组更改,使用第二个(我可以说是强类型),我只需要在一个位置更改名称。

于 2012-11-20T17:33:14.207 回答