AuthorizeAttribute构造函数参数Roles等于string.empty的含义?

时间:2011-12-20 09:21:57

标签: asp.net-mvc authorization

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

请帮助解决正确的2个答案


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

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

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

2 个答案:

答案 0 :(得分:6)

查看AuthorizeAttribute的源代码,表明没有通配符“*”。

如果[Authorize(Users = "")]导致“没有人”可以访问该行动,则没有任何意义。

因此,答案 1 2 是正确的。

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
    }
}

答案 1 :(得分:2)

编辑:我已将此更改为现在正确,只是补充dknaack的正确答案

使用[Authorize]修饰操作意味着必须对用户进行身份验证。

因此,如果您希望任何已登录的用户能够访问某个操作,那么放置[Authorize]是正常的。

dknaack已经提到了源代码,所以他的答案必须正确,即使它对我来说似乎有点奇怪。但显然是对的!

只是要添加,如果_usersSplit与逗号上的正常分割相似,那么我们希望_usersSplit.Length 1 _users =""时我仍然是正确的RemoveEmptyEntries ,但我想split功能正在使用{{1}}选项。现在不能参考这个来源(昨天有膝盖操作,暂时不允许在电脑上使用 - 大声笑)。

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

  

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