混合组和用户的asp.net mvc [Authorize()]属性

use*_*909 5 c# authentication asp.net-mvc authorization

我使用ASP.NET MVC 1.1与Windows身份验证.我试图只授权一个团体的成员和我自己.我不是该组的成员,也不需要成为该组的成员.每次访问网络应用程序的URL时,我都会收到Windows登录/密码提示.HomeController有

[HandleError]
[Authorize(Roles=@"MyDomain\\company.security.group.name")]  
[Authorize(Users=@"MyDoamin\\MyName")]
[OutputCache(Duration=86400,VaryByParam="PageIndex")]
public class HomeController : Controller
Run Code Online (Sandbox Code Playgroud)

我如何启用此类授权?Web应用程序在IIS6上的站点下运行.该站点具有目录安全性以接受匿名.Web应用程序/虚拟目录已禁用匿名并启用了Windows集成安全性.web.config有

Cra*_*ntz 13

您可以通过子类型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(',');
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 我知道这是一个老帖子,但你似乎错过的是`@`消除了逃避反斜杠的需要.当您同时执行这两项操作时,您将创建一个包含两个反斜杠的字符串文字,而不是您需要的单个斜杠. (2认同)

And*_*ose 13

由于您使用"@"字符为域/用户和域/组字符串添加前缀,因此无需双击反斜杠.您可以尝试使用以下任一项替换这些行:

[Authorize(Roles="MyDomain\\company.security.group.name")]  
[Authorize(Users="MyDoamin\\MyName")]
Run Code Online (Sandbox Code Playgroud)

要么

[Authorize(Roles=@"MyDomain\company.security.group.name")]  
[Authorize(Users=@"MyDoamin\MyName")]
Run Code Online (Sandbox Code Playgroud)

进一步阅读还表明,授权过滤器将执行"用户"和"角色"检查.如果用户不满足这两个要求,那么他们将被拒绝访问.
要获得所需的行为,您需要按照上一个答案中的建议编写自定义授权过滤器.