3

Windows認証を使用するmvcイントラネットアプリケーションがあります。現在、3つのアクションを持つコントローラが1つあります。mvc windows authenticationドメインからのすべてのユーザーを許可します

最初のアクション(インデックス)は誰にでも利用できるはずですが、これは問題ありません。 2番目と3番目の操作は、特定のDOMAINのユーザーのみが使用できるようにする必要があります。しかし、<Authorize()>タグは2つのオプションしか与えません:ロールまたはユーザー。私はユーザーを使用し、それを 'DOMAIN *'と 'DOMAIN \?'に設定しようとしました。しかし、それは動作しません。

私はインターネット上で検索してきましたが、私が欲しいものを達成する方法を見つけることができないようです。誰かが私を助けてくれることを願っています!

おかげ

答えて

10

ロール名として使用DOMAIN\Domain Users。ドメイン内のすべてのユーザーを含む、組み込みのグループ。のみ(これでできる特定のドメインのユーザー)特定の役割のユーザーがコントローラにアクセスできるようになります

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

を/次を使用して、コントローラやアクションを飾る、前述jrummelものに追加

+0

それは完璧だった!どうもありがとうございました。 – laureysruben

5

アクション(あなたが飾ることによる)。また、あなたは、ドメインの目的のために属性独自の承認を作成することができます。そのような

/// <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" })]

+0

私はそれを行う方法を知っていましたが、私は "DOMAIN \ Domain Users"を使用できるかどうか分かりませんでした。私のポストで言及されたが、おそらく私は< and > – laureysruben

+0

@laureysrubenでvbの構文を使用したため、おそらくフィルタリングされてしまった。実際、属性(私の謝罪)は見られなかった。あなたが望むなら、私は '[DomainAuthorize(Domains =" ABC、DEF ")]'を書くつもりでした。 –

+0

これは非常にエレガントなソリューションです。私はこのようなことをしたことはありません(既存のものに基づいてカスタム属性を作成しています)。ありがとう! – laureysruben

2

を、ここでは上記の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 

これは誰かに役立つことを願います。 (すべてのクレジットはBrad Christieに行く)

+0

変換のおかげで! –

関連する問題