在 ASP.NET MVC 3 应用程序中扩展 Windows 身份验证

Posted

技术标签:

【中文标题】在 ASP.NET MVC 3 应用程序中扩展 Windows 身份验证【英文标题】:Extending Windows Authentication in ASP.NET MVC 3 Application 【发布时间】:2012-01-26 12:38:41 【问题描述】:

经过大量谷歌搜索和阅读有关如何在 ASP.NET 应用程序中管理混合模式身份验证的几个解决方案后,我仍然没有合适的解决方案来解决我的问题。

我必须为一堆不同的用户组实现一个 Intranet 应用程序。到目前为止,我一直使用 Windows 身份验证,这很容易实现。当涉及为特殊应用程序功能授权用户组时,我的问题就出现了。

使用[Authorize(Users = "DOMAIN\\USER")] 效果很好,但由于我无法访问活动目录管理,因此我无法按照我的应用程序需要的方式配置角色管理。

除了在活动目录中定义的角色和成员资格之外,我想做的是定义自定义角色和成员资格(这样的扩展可能吗?例如,通过实现自己的成员资格提供程序?)。

你认为我的问题的最佳解决方案是什么。除了 windows 身份验证之外,我真的必须使用表单身份验证来实现复杂的混合模式身份验证吗?

使用的技术:

MS SQL Server 2008 MS VS 2010 ASP.NET MVC 3 - Razor 视图引擎 Telerik ASP.NET MVC 扩展 Windows Server 2008 上的 IIS 7

编辑(最终解决方案感谢 dougajmcdonald 的帮助):

在指示我使用自定义 IPrincipal 实现后,我找到了一些解决方案 here 和 here。把所有东西放在一起,我得出了以下解决方案:

1.创建自定义主体实现:

public class MyPrincipal: WindowsPrincipal

    List<string> _roles;

    public MyPrincipal(WindowsIdentity identity) : base(identity) 
        // fill roles with a sample string just to test if it works
        _roles = new List<string>"someTestRole"; 
        // TODO: Get roles for the identity out of a custom DB table
    

    public override bool IsInRole(string role)
    
        if (base.IsInRole(role) || _roles.Contains(role))
        
            return true;
        
        else
        
            return false;
        
    

2.通过扩展“Global.asax.cs”文件将我的自定义主体实现集成到应用程序中:

    protected void Application_AuthenticateRequest(object sender, EventArgs e)
    
        if (Request.IsAuthenticated)
        
            WindowsIdentity wi = (WindowsIdentity)HttpContext.Current.User.Identity;
            MyPrincipal mp = new MyPrincipal(wi);
            HttpContext.Current.User = mp;
        
    

3.在我的应用程序中使用我的自定义角色进行授权

public class HomeController : Controller

    [Authorize(Roles= "someTestRole")]
    public ActionResult Index()
    
        ViewBag.Message = "Welcome to ASP.NET MVC!";

        return View();
    

有效!!!是的!

【问题讨论】:

【参考方案1】:

我不确定这是否仍然适用于 MVC,但在 Webforms 中,一种方法如下:

    创建一个可能扩展 WindowsPrincipal 的新 IPrincipal 实现 在这个类中,给它一个角色集合(你自己的自定义角色) 填充这些角色,也许可以从数据库中获取它们。 如果提供的角色来自基本调用 (WindowsAuthentication/Role) 或来自您自己的自定义角色集合,则覆盖 IsInRole 以返回 true。

这样您仍然可以挂接到 Principal.IsInRole("MyRole") 以及主体 [PrincipalPermission()] 注释。

希望对你有帮助。

编辑回答 q's:

要将主体集成到授权中,您需要在 global.asax 中为 OnAuthenticate 编写自己的方法,用于身份验证类型,所以我猜你是这样的:

void WindowsAuthentication_OnAuthenticate(object sender, WindowsAuthenticationEventArgs e)

    // ensure we have a name and made it through authentication
    if (e.Identity != null && e.Identity.IsAuthenticated)
    
        //create your principal, pass in the identity so you know what permissions are tied to
        MyCustomePrincipal opPrincipal = new MyCustomePrincipal(e.Identity);            
        //assign your principal to the HttpContext.Current.User, or perhaps Thread.Current
        HttpContext.Current.User = opPrincipal;    
    

我相信 Authorize 是在以后加入 PrincipalPermission,但我不太确定何时/为什么会出现差异:( - 抱歉!

【讨论】:

没问题,很高兴它有帮助。我最近不得不做一些非常相似的事情!在我的情况下,我不想使用 Windows Active Directory 角色(因为我们的管理员不想那样管理事情),但我想确保如果他们决定我们可以使用它们,因此决定绑定到 IPrincipal而不是仅仅创建一个用户帐户作为我们应用程序内部的一个类并针对它坚持角色。

以上是关于在 ASP.NET MVC 3 应用程序中扩展 Windows 身份验证的主要内容,如果未能解决你的问题,请参考以下文章

在 ASP.net core mvc 3.1 中的 HtmlHelper 扩展方法中使用 DataAnnotation 本地化器

指定在 asp.net mvc 应用程序中上传的可能扩展名 [重复]

Orchard源码分析:ASP.NET MVC相关

在 ASP.NET MVC 3 中添加您自己的 HtmlHelper

玩转Asp.net MVC 的八个扩展点

Asp.net模块化开发之Mvc分区扩展框架