Asp.Net MVC中如何统一存储Authorize特性用户列表并修复自定义特性问题?
我之前也碰到过一模一样的情况,直接硬编码Users能生效,但从配置里读就不行,问题大概率出在配置字符串的格式处理或者默认特性的内部验证逻辑上。给你两个可行的修复方案:
方案一:修复配置字符串的空格问题(快速解决)
你在appSettings里写的value="g@gmail.com, m@gmail.com"里,逗号后面带了空格,而默认的AuthorizeAttribute会把这个空格当成用户名的一部分,导致登录用户的邮箱(比如m@gmail.com)和配置里的 m@gmail.com(带空格)匹配不上。
修改自定义特性的构造函数,自动去除每个用户的空格:
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method)] public class MyAuthorizeAttribute : AuthorizeAttribute { public MyAuthorizeAttribute() { var adminUsers = WebConfigurationManager.AppSettings["admins"]; if (!string.IsNullOrEmpty(adminUsers)) { // 分割后去除每个用户的前后空格,再重新拼接 this.Users = string.Join(",", adminUsers.Split(',') .Select(user => user.Trim()) .Where(user => !string.IsNullOrWhiteSpace(user))); } } }
这样处理后,配置里的空格就不会影响验证了。
方案二:重写验证逻辑(更可靠灵活)
如果不想依赖AuthorizeAttribute内部对Users属性的处理逻辑,可以直接重写AuthorizeCore方法,自己实现用户验证,这样更可控:
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method)] public class MyAuthorizeAttribute : AuthorizeAttribute { private readonly HashSet<string> _allowedUsers; public MyAuthorizeAttribute() { var adminUsers = WebConfigurationManager.AppSettings["admins"]; // 用HashSet存储,忽略大小写,提升查询效率 _allowedUsers = string.IsNullOrEmpty(adminUsers) ? new HashSet<string>() : new HashSet<string>(adminUsers.Split(',') .Select(user => user.Trim()) .Where(user => !string.IsNullOrWhiteSpace(user)), StringComparer.OrdinalIgnoreCase); } protected override bool AuthorizeCore(HttpContextBase httpContext) { if (httpContext == null) throw new ArgumentNullException(nameof(httpContext)); var currentUser = httpContext.User; // 先判断用户是否已登录 if (!currentUser.Identity.IsAuthenticated) return false; // 获取当前用户的标识(注意:如果用的是ASP.NET Identity,这里可能需要取Email而不是Name) var userIdentifier = currentUser.Identity.Name; // 检查是否在允许列表中 return _allowedUsers.Contains(userIdentifier); } }
额外注意事项
- 如果你的项目用的是ASP.NET Identity,默认
Identity.Name可能是用户名而不是邮箱,这时候需要调整AuthorizeCore里的用户标识获取逻辑:var userManager = httpContext.GetOwinContext().GetUserManager<ApplicationUserManager>(); var user = userManager.FindById(currentUser.Identity.GetUserId()); var userIdentifier = user?.Email; - 确保
appSettings的配置项名称完全匹配(比如你代码里读的是"admins",配置里的key也要是"admins"),避免拼写错误。
内容的提问来源于stack exchange,提问作者Soapkelele
相关产品推荐
相关产品推荐

