gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 22:36:18 29 4
gpt4 key购买 nike

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

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

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

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

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

使用的技术:

  • MS SQL Server 2008
  • MS VS 2010
  • ASP.NET MVC 3 - Razor View 引擎
  • 适用于 ASP.NET MVC 的 Telerik 扩展
  • Windows Server 2008 上的 IIS 7

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

    在指出我使用自定义 IPrincipal 实现之后,我找到了一些解决方案 herehere .将所有内容放在一起,我得出了以下解决方案:

    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 中,一种方法如下:

  • 创建一个新的 IPrincipal 实现,可能会扩展 WindowsPrincipal
  • 在这个类中,给它一个角色集合(你自己的自定义角色)
  • 填充这些角色,也许可以从数据库中获取它们。
  • 如果提供的角色来自基本调用 (WindowsAuthentication/Role) 或来自您自己的自定义角色集合,则覆盖 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 稍后会进入 PrincipalPermission,但我不太确定何时/为什么会出现差异:( - 对不起!

    关于asp.net-mvc - 在 ASP.NET MVC 3 应用程序中扩展 Windows 身份验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9018222/

    29 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com