c# - 混合组和用户的 asp.net mvc [Authorize()] 属性

标签 c# asp.net-mvc authentication authorization

我正在使用带有 Windows 身份验证的 ASP.NET MVC 1.1。我试图只授权一个组的成员和我自己。我不是该组的成员,也不需要成为该组的成员。每次访问 Web 应用程序的 URL 时,我都会收到 Windows 登录名/密码提示。 HomeController 有

[HandleError]
[Authorize(Roles=@"MyDomain\\company.security.group.name")]  
[Authorize(Users=@"MyDoamin\\MyName")]
[OutputCache(Duration=86400,VaryByParam="PageIndex")]
public class HomeController : Controller

如何启用此类授权? Web 应用程序在 IIS6 上的站点下运行。该站点具有接受匿名的目录安全性。 Web 应用程序/虚拟目录已禁用匿名并启用了 Windows 集成安全性。 web.config 有

最佳答案

您可以子类型AuthorizeAttribute 来查看用户 角色。从我的头顶(未经测试):

using System;
using System.Linq;
using System.Security.Principal;
using System.Web;
using System.Web.Mvc;

public class MyAuthorizeAttribute : AuthorizeAttribute
{
    // This method must be thread-safe since it is called by the thread-safe OnCacheAuthorization() method.
    protected override bool AuthorizeCore(HttpContextBase httpContext) {
        base.AuthorizeCore(httpContext);

        if ((!string.IsNullOrEmpty(Users) && (_usersSplit.Length == 0)) ||
           (!string.IsNullOrEmpty(Roles) && (_rolesSplit.Length == 0)))
        {
            // wish base._usersSplit were protected instead of private...
            InitializeSplits();                
        }

        IPrincipal user = httpContext.User;
        if (!user.Identity.IsAuthenticated) {
            return false;
        }

        var userRequired = _usersSplit.Length > 0;
        var userValid = userRequired
            && _usersSplit.Contains(user.Identity.Name, StringComparer.OrdinalIgnoreCase);

        var roleRequired = _rolesSplit.Length > 0;
        var roleValid = (roleRequired) 
            && _rolesSplit.Any(user.IsInRole);

        var userOrRoleRequired = userRequired || roleRequired;

        return (!userOrRoleRequired) || userValid || roleValid;
    }

    private string[] _rolesSplit = new string[0];
    private string[] _usersSplit = new string[0];

    private void InitializeSplits()
    {
        lock(this)
        {
            if ((_rolesSplit.Length == 0) || (_usersSplit.Length == 0))
            {
                _rolesSplit = Roles.Split(',');
                _usersSplit = Users.Split(',');
            }
        }
    }
}

关于c# - 混合组和用户的 asp.net mvc [Authorize()] 属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2136979/

相关文章:

c# - 当我从条件组中省略 "else"时,为什么 .NET 的正则表达式引擎表现得如此奇怪?

c# - 处理 HelpButton 单击事件?

Android Jtwitter,身份验证问题

javascript - 在javascript中声明可观察到的动态 knockout

reactjs - 使用 Oauth2、React、Node.js 和 Passport.js 通过 Google 登录按钮对用户进行身份验证的最佳实践是什么?

api - 如何安全地让我的用户使用刷新 token 登录?

c# - 如何验证电子邮件来自ASP.NET MVC中的特定域?

c# - 如何在 .NET 中释放部分 DLL

javascript - 如何阻止在文本区域中输入回车?

asp.net-mvc - 将来自 MVC 程序集中的资源的脚本和 CSS bundle 在一起