【问题标题】:AuthorizeAttribute constructor argument Roles equals string.empty meaning?AuthorizeAttribute 构造函数参数 Roles 等于 string.empty 是什么意思?
【发布时间】:2026-01-17 15:30:01
【问题描述】:

这是来自一些 MCTS 70-515 考试练习测试的问题。

请帮忙回答正确的 2 个答案


您正在实现一个允许用户查看和编辑数据的 ASP.NET MVC 2 Web 应用程序。您需要确保只有登录用户可以访问控制器的编辑操作。您可以向“编辑”操作添加哪两个可能的属性来实现此目标?

(每个正确答案都代表一个完整的解决方案。选择两个。)

  1. [授权(Users = "")]
  2. [授权(角色=“”)]
  3. [授权(Users = "*")]
  4. [授权(角色=“*”)]

【问题讨论】:

  • 我认为 3 和 4 是正确的,但实践测试表明 1 和 2 是正确的
  • 对,请检查我的答案中的源代码。

标签: asp.net-mvc authorization


【解决方案1】:

查看AuthorizeAttribute的源码,发现没有通配符“*”。

[Authorize(Users = "")] 会导致“没有人”可以访问该操作是没有意义的。

所以回答12是正确的。

AuthorizeAttribute的源代码

protected virtual bool AuthorizeCore(HttpContextBase httpContext) {
    if (httpContext == null) {
        throw new ArgumentNullException("httpContext");
    }

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

    if (_usersSplit.Length > 0 && !_usersSplit.Contains(user.Identity.Name, StringComparer.OrdinalIgnoreCase)) {
        return false;
    }

    if (_rolesSplit.Length > 0 && !_rolesSplit.Any(user.IsInRole)) {
        return false;
    }

    return true;
}

还有RoleUsers 属性。

public string Roles {
    get {
        return _roles ?? String.Empty;
    }
    set {
        _roles = value;
        _rolesSplit = SplitString(value); // simple split by comma
    }
}

public string Users {
    get {
        return _users ?? String.Empty;
    }
    set {
        _users = value;
        _usersSplit = SplitString(value); // simple split by comma
    }
}

【讨论】:

    【解决方案2】:

    编辑:我已经改变了这个,所以它现在是正确的,只是补充了 dknaack 的正确答案

    使用[Authorize] 装饰动作意味着用户必须经过身份验证。

    因此,如果您希望任何已登录的用户能够访问某个操作,只需输入[Authorize] 即可。

    dknaack 参考了源代码,所以他的回答一定是正确的,尽管我觉得有点奇怪。但显然是对的!

    补充一下,如果_usersSplit 就像逗号上的正常拆分,那么我们希望_usersSplit.Length_users ="" 时是1,我仍然是对的,但我猜拆分功能是使用RemoveEmptyEntries 选项。现在不能以 am afk 的身份引用其来源(昨天进行了膝关节手术,目前还不允许在计算机上使用 - 哈哈)。

    空字符串不是用户或角色的有效名称。见这里:http://msdn.microsoft.com/en-us/library/8fw7xh74(v=VS.100).aspx

    如果有任何指定的用户,您应该抛出 ArgumentException 名称或角色名称是一个空字符串,如果是 ArgumentNullException 任何指定的用户名或角色名都为空(在 Visual Basic)。

    【讨论】:

    • +1 这是另一个很好的解释:asp.net/web-forms/tutorials/security/membership/…
    • 谢谢。并感谢您的链接。 Scott Mitchell 的任何作品通常都非常好! :-)
    • 我以为我确定了,但显然不是。感谢您的澄清。这不是我写那个属性的方式!