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

2024-04-08

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

我必须为一堆不同的用户组实现一个 Intranet 应用程序。到目前为止,我一直使用 Windows 身份验证,它的实现非常简单。当涉及到授权用户组使用特殊应用程序功能时,我遇到了问题。

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

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

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

使用的技术:

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

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

在指示我使用自定义 IPrincipal 实现后,我找到了一些解决方案here http://smehrozalam.wordpress.com/2009/01/01/using-customprincipal-with-forms-authentication-in-aspnet/ and here http://jbaurle.wordpress.com/2007/07/24/creating-custom-windows-authentication-roles-in-asp-net-2/。将所有内容放在一起,我得出以下解决方案:

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();
    }
}

有用!!!是的!


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

  1. 创建一个新的 IPrincipal 实现,或许可以扩展 WindowsPrincipal
  2. 在此类中,为其提供角色集合(您自己的自定义角色)
  3. 填充这些角色,也许可以从数据库中获取它们。
  4. 如果提供的角色从基本调用 (WindowsAuthentication/Role) 或您自己的自定义角色集合中为 true,则重写 IsInRole 以返回 true。

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

希望能帮助到你。

编辑回答q:

要将主体集成到授权中,您需要在 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 会在稍后的日期加入到 PrimaryPermission 中,但我不太确定何时/为何会出现差异,恐怕:( - 抱歉!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 ASP.NET MVC 3 应用程序中扩展 Windows 身份验证 的相关文章

  • 如何在 ASP.NET MVC 中手动设置用户角色?

    我正在从事的这个项目要求我保留管理员用户的本地数据库 并为普通用户使用外部数据库 在管理数据库中通过身份验证的任何人都应被分配 管理员 角色 而通过其他数据库进行身份验证的任何人将始终被分配 用户 角色 我可以手动分配这些角色吗 我不需要角
  • MVC3 TextBoxFor 带有编码文本

    有没有办法将 TextBoxFor 助手与编码文本一起使用 例如 当使用 MVC3 With Razor 视图引擎的以下帮助程序时 Html TextBoxFor model gt model Description 并且对 model D
  • 将 Javascript 类数组传递给 MVC 控制器?

    我正在尝试将一系列服务传递给我的控制器 我尝试了很多不同的方法来让它工作 在进入控制器之前序列化数据 序列化每个服务 唯一有效的方法是将控制器参数更改为字符串并序列化数组 然后使用 JsonConvert 但我 d 宁愿不这样做 使用指定的
  • ASP.net MVC 项目无法在 IIS 上编译

    我以前只是将 ASP NET 网站上传到实时服务器 IIS 会自动编译它们 但是 当我对 asp net MVC 项目执行相同操作时 我只是收到错误 并且我需要在上传项目之前发布 构建 项目 注意1 我使用的是VWD 2008 Expres
  • 服务层设计。将事物放入服务层的原因

    我有一些与设计相关的问题 should service layer interfaces居住在一个domain layer 例如user service 将代码部分移动到单独层的主要原因是什么 should service layer居住在
  • ASP.NET MVC 显示配置文件中的用户名

    以下是LogOn来自 Visual Studio 创建的标准默认 ASP NET MVC 项目的用户控件 登录用户控件 ascx Welcome b b
  • 如何使自定义错误页面在 ASP.NET MVC 4 中工作

    我想要显示 500 404 和 403 的自定义错误页面 这是我所做的 在 web config 中启用自定义错误 如下所示
  • 用于验证 IIS 设置的 Powershell 脚本

    是否可以使用 Power Shell 脚本获取 IIS 设置 我希望使用脚本获取 检查以下信息 检查 Windows 身份验证提供程序是否正确列出 协商 NTLM 检查是否启用了 Windows 身份验证 Windows 身份验证高级设置
  • 如何根据 ASP.NET VNEXT MVC6 中给出的路径进行虚拟路由/重定向?

    我有一个网站 它在不同的路径上公开多个 API 每个 API 由特定于应用程序部分的控制器处理 例如example com Api Controller Action param1 stuff 其中控制器发生变化 但操作保持相当一致 我有几
  • 传入字典的模型项是类型

    我有一个我理解的错误 但无法找出以正确的方式解决的方法 我有一个 MasterPage 我从该 MasterPage 中调用 标签是一个强类型视图 如下所示 我像这样返回 PartialView return View Tags resul
  • asp.net mvc 4 - 可以在每个线程共享 DbContext 吗?

    From 每个 Web 请求一个 DbContext 为什么 https stackoverflow com questions 10585478 one dbcontext per web request why 我的理解是 DbCont
  • ASP.NET MVC 子操作的路由匹配

    子动作的路由匹配方法与普通动作有什么不同吗 换句话说 子操作是否有一些自动生成的 url 来进行与父操作类似的匹配 父级或子级动作处理没有区别 任何操作都遵循您在中设置的相同路线定义Application Start 这意味着父母的行为以及
  • MVC 项目中的 .Rdlc 报告 - 托管调试助手“PInvokeStackImbalance”

    我即将完成并运行我的上一份报告 我在其他报告中没有遇到过这个问题 我正在尝试根据数据库记录创建报告 当我通过 LocalReport 创建报告并为报告创建参数时 收到错误消息 托管调试助手 PInvokeStackImbalance 调用
  • IsReusable 属性中的上下文切换

    是否可重用属性 下面是我的理解IsReusable财产 如果处理程序返回静态内容 将值设置为 true 是安全的 但如果线程返回动态内容 为了使其线程安全 IsReusable应设置为 false 在这种情况下 可能会发生上下文切换 这可能
  • ASP.NET MVC,控制器可以改变提交的值吗?

    ASP NET MVC 中是否允许更改提交的值 HttpPost public ActionResult Create Person toCreate toCreate Lastname toCreate Lastname A return
  • Coldfusion 10、IIS 7.5 - 即使文件存在也收到 404

    即使该页面存在于磁盘上 我也收到 404 错误 我已经运行了 Web 服务器配置工具并重新启动了几次 cfm 文件的处理程序映射 配置工具似乎有效 C ColdFusion10 config wsconfig 1 isapi redirec
  • 如何更改jqGrid的主题?

    我正在寻找更改当前版本的 jqGrid 主题的方法 我最近开始在 ASP Net MVC 2 应用程序中使用 jqGrid 并下载一些演示解决方案 项目 我尝试通过更改主题 ui javascript 来更改网格的主题 但这对我不起作用 看
  • 用户 ASP.NET 运行于

    我有点困惑 ASP NET 如何在什么用户下运行 在 iis 7 5 和 6 0 上 一些我不清楚的用户帐户是 网络服务 IUSR AppPool 对不同用户的任何澄清以及安全考虑等都将不胜感激 总之 IIS 5 1 Windows XP
  • 构建视图模型的最佳方法是什么?

    我正在使用带有实体框架的 asp net mvc 并开始学习 DDD 我正在从事包含调查的项目 这是我的域模型 public class Survey public int SurveyID get set public string Na
  • 将 .MDF SQL Server 数据库与 ASP.NET 结合使用与使用 SQL Server

    我目前正在 ASP NET MVC 中编写一个网站 我的数据库 其中还没有任何数据 只有正确的表 使用 SQL Server 2008 我已将其安装在我的开发计算机上 我使用服务器资源管理器从应用程序连接到数据库 然后使用 LINQ to

随机推荐