asp.net mvc [Authorize()] attribute for mixed group and user

前端 未结 2 2026
南笙
南笙 2020-12-18 05:41

I am using ASP.NET MVC 1.1 with Windows authentication. I trying to only authorize members of a group and myself. I am not a member of the group and would not need to be a

2条回答
  •  时光取名叫无心
    2020-12-18 06:20

    You can subtype AuthorizeAttribute to look at Users and Roles. off the top of my head (untested):

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

提交回复
热议问题