代码之家  ›  专栏  ›  技术社区  ›  user266909

混合组和用户的ASP.NET MVC[authorize()]属性

  •  5
  • user266909  · 技术社区  · 15 年前

    我正在使用带有Windows身份验证的ASP.NET MVC 1.1。我试图只授权一个团体的成员和我自己。我不是小组成员,不需要成为这个小组的成员。每次访问Web应用的URL时,我都会收到Windows登录/密码提示。家庭控制器

    [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有

    2 回复  |  直到 8 年前
        1
  •  13
  •   Peter    8 年前

    你可以分型 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(',');
                }
            }
        }
    }
    
        2
  •  13
  •   Andy Rose    15 年前

    当您在域/用户和域/组字符串前面加上“@”字符时,不需要重复转义反斜杠。您可以尝试将这些行替换为:

    [Authorize(Roles="MyDomain\\company.security.group.name")]  
    [Authorize(Users="MyDoamin\\MyName")]
    

    [Authorize(Roles=@"MyDomain\company.security.group.name")]  
    [Authorize(Users=@"MyDoamin\MyName")]
    

    进一步阅读还发现,授权过滤器将执行“用户”和“角色”检查。如果用户不满足这两个要求,那么他们将被拒绝访问。
    要获得您想要的行为,您需要按照前面的回答中的建议编写自定义授权过滤器。