атрибут asp.net mvc [Authorize ()] для смешанной группы и пользователя - PullRequest
5 голосов
/ 26 января 2010

Я использую ASP.NET MVC 1.1 с аутентификацией Windows. Я пытаюсь авторизовать только членов группы и себя. Я не являюсь членом группы и не должен был бы быть членом этой группы. Я получаю Windows логин / пароль каждый раз, когда я получаю доступ к URL веб-приложения HomeController имеет

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

Как включить такую ​​авторизацию? Веб-приложение работает под сайтом на IIS6. На сайте есть каталог безопасности для принятия анонимных. В веб-приложении / виртуальном каталоге отключен анонимный доступ и включена встроенная защита Windows. Файл web.config имеет

Ответы [ 2 ]

13 голосов
/ 03 марта 2010

Поскольку вы префикс вашего домена / пользователя и строки домена / группы символом '@', вам не нужно дважды экранировать обратную косую черту. Вы можете попробовать заменить эти строки на:

[Authorize(Roles="MyDomain\\company.security.group.name")]  
[Authorize(Users="MyDoamin\\MyName")]

или

[Authorize(Roles=@"MyDomain\company.security.group.name")]  
[Authorize(Users=@"MyDoamin\MyName")]

Немного дальнейшего чтения также показало, что фильтр Авторизации будет выполнять проверку «пользователей» и «ролей». Если пользователь не отвечает обоим требованиям, ему будет отказано в доступе.
Чтобы получить желаемое поведение, вам нужно написать собственный фильтр авторизации, как предложено в предыдущем ответе.

13 голосов
/ 26 января 2010

Вы можете ввести подтип 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(',');
            }
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...