Проверка подлинности Windows MVC позволяет всем пользователям из домена - PullRequest
3 голосов
/ 08 декабря 2011

У меня есть приложение для внутренней сети mvc, использующее проверку подлинности Windows.В настоящее время он имеет один контроллер с тремя действиями.

Первое действие (индекс) должно быть доступно каждому, это не проблема.Второе и третье действия должны быть доступны только пользователям в определенном домене.Однако тег <Authorize()> дает мне только 2 варианта: роли или пользователи.Я пытался использовать Users и установить для него «DOMAIN *» и «DOMAIN \?»но это не работает

Я искал по всему интернету, но не могу найти какой-либо способ выполнить то, что я хочу.Я надеюсь, что кто-то здесь может помочь мне!

Ответы [ 3 ]

10 голосов
/ 08 декабря 2011

Используйте DOMAIN\Domain Users в качестве имени роли. Это встроенная группа, которая, как вы уже догадались, содержит всех пользователей в домене.

5 голосов
/ 08 декабря 2011

В дополнение к тому, что упомянул jrummel, украсьте свой контроллер или действие следующим образом:

[Authorize(Roles = "DOMAIN\Domain Users")]

Это позволит только пользователям в определенной роли (в этом случае пользователи определенного домена) иметь доступ к контроллеру / действию (в зависимости от того, что вы украшаете). Кроме того, вы можете создать свой собственный атрибут авторизации для доменов:

/// <summary>
/// Specified which domains a user should belong to in order to access the decorated
/// controller/action
/// </summary>
public class DomainAuthorizeAttribute : AuthorizeAttribute
{
    private String[] domains = new String[0];

    /// <summary>
    /// List of acceptable domains
    /// </summary>
    public String[] Domains
    {
        get { return this.domains; }
        set { this.domains = value; }
    }

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

        // User not logged in
        if (!httpContext.User.Identity.IsAuthenticated)
        {
            return false;
        }

        // No roles to check against
        if (this.Domains.Length == 0)
        {
            return true;
        }

        // check if they're on any of the domains specified
        String[] roles = this.Domains.Select(d => String.Format(@"{0}\Domain Users", d)).ToArray();
        if (roles.Any(httpContext.User.IsInRole))
        {
            return true;
        }

        return false;
    }
}

Что-то подобное должно позволить вам сделать:
[DomainAuthorize(Domains = new[]{ "DOMAIN1", "DOMAIN2" })]

2 голосов
/ 09 декабря 2011

Для интересующихся, вот версия VB приведенного выше фрагмента кода:

''' <summary>
''' Specified which domains a user should belong to in order to access the decorated
''' controller/action
''' </summary>
Public Class DomainAuthorizeAttribute
    Inherits AuthorizeAttribute
    Private m_domains As [String]() = New [String](-1) {}

    ''' <summary>
    ''' List of acceptable domains
    ''' </summary>
    Public Property Domains() As [String]()
        Get
            Return Me.m_domains
        End Get
        Set(value As [String]())
            Me.m_domains = value
        End Set
    End Property

    Protected Overrides Function AuthorizeCore(httpContext As HttpContextBase) As Boolean
        If httpContext Is Nothing Then
            Throw New ArgumentNullException("httpContext")
        End If

        ' User not logged in
        If Not httpContext.User.Identity.IsAuthenticated Then
            Return False
        End If

        ' No roles to check against
        If Me.Domains.Length = 0 Then
            Return True
        End If

        ' check if they're on any of the domains specified
        Dim roles As [String]() = Me.Domains.[Select](Function(d) [String].Format("{0}\Domain Users", d)).ToArray()

        For Each r In roles
            If httpContext.User.IsInRole(r) Then
                Return True
            End If
        Next

        Return False
    End Function
End Class

Надеюсь, это будет кому-то полезно!(Все заслуги передаются Брэду Кристи)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...