2012-01-26 12 views
14

多くのグーグルとASP.NETアプリケーションで混在モードの認証を管理する方法に関するいくつかの解決策を読んだ後、私はまだ私の問題の解決策はありません。ASP.NET MVC 3アプリケーションでWindows認証を拡張する

さまざまなユーザーグループのイントラネットアプリケーションを実装する必要があります。今まで私は実装が非常に簡単だったWindows認証を使用しました。私の問題は、特別なアプリケーション機能のためにユーザーグループを認可する場合に発生します。

[Authorize(Users = "DOMAIN\\USER")]を使用すると、私はアクティブディレクトリの管理にアクセスできないため、自分のアプリケーションに必要な方法で役割管理を設定することはできません。

私がしたいのは、アクティブなディレクトリ内で定義されているものに加えてカスタムロールとメンバーシップを定義することです(独自のメンバーシッププロバイダを実装するなどの拡張が可能です)。

私の問題のための最良の解決策は何だと思いますか? Windows認証に加えて、フォーム認証で複雑な混合モード認証を実装する必要がありますか?

使用される技術:ASP.NET MVC 3

  • MS SQL Server 2008の
  • MS VS 2010
  • - レイザービューエンジン
  • ASP.NET MVCのためのTelerik拡張
  • IIS 7 Windows Server 2008の場合

E DIT(dougajmcdonaldのヘルプへの最終的な解決策のおかげで):

カスタムIPrincipal実装を使用するために私を指した後、私はいくつかのソリューションherehereを見つけました。一緒にすべてを置く私は次の解決策に来た:

1.Createカスタムプリンシパル実装:「Global.asax.cs」ファイルを拡張してアプリケーションに

public class MyPrincipal: WindowsPrincipal 
{ 
    List<string> _roles; 

    public MyPrincipal(WindowsIdentity identity) : base(identity) { 
     // fill roles with a sample string just to test if it works 
     _roles = new List<string>{"someTestRole"}; 
     // TODO: Get roles for the identity out of a custom DB table 
    } 

    public override bool IsInRole(string role) 
    { 
     if (base.IsInRole(role) || _roles.Contains(role)) 
     { 
      return true; 
     } 
     else 
     { 
      return false; 
     } 
    } 
} 

2.Integrate私のカスタムプリンシパルの実装:私のアプリケーションでの承認のための私のカスタムロール3.Use

protected void Application_AuthenticateRequest(object sender, EventArgs e) 
    { 
     if (Request.IsAuthenticated) 
     { 
      WindowsIdentity wi = (WindowsIdentity)HttpContext.Current.User.Identity; 
      MyPrincipal mp = new MyPrincipal(wi); 
      HttpContext.Current.User = mp; 
     } 
    } 

public class HomeController : Controller 
{ 
    [Authorize(Roles= "someTestRole")] 
    public ActionResult Index() 
    { 
     ViewBag.Message = "Welcome to ASP.NET MVC!"; 

     return View(); 
    } 
} 

それは動作します!ええ!

答えて

8

私はこれはまだMVCに適用されますが、次のようにこれは次のようになります行うためのWebフォーム一方向にかはわからない:

  1. おそらくこのクラスでのWindowsPrincipal
  2. を拡張し、新たなIPrincipal実装を作成し、ロールのコレクション(独自のカスタムロール)を指定します。
  3. これらのロールを、おそらくDBから取得することで、それらのロールに移入します。
  4. 提供されたロールが基本呼び出し(WindowsAuthentication/Role)からTrueの場合、または独自のカスタムロールコレクションからTrueの場合は、IsInRoleをオーバーライドしてtrueを返します。

このようにしても、Principal.IsInRole( "MyRole")とプリンシパルの[PrincipalPermission()]アノテーションにフックできます。

希望します。 Qさんへの答えで

EDIT:

ので、私はあなたのための推測、あなたがする認証タイプのGlobal.asaxの中OnAuthenticateための独自のメソッドを記述するために必要な権限に元本を統合するために、このような何か:

void WindowsAuthentication_OnAuthenticate(object sender, WindowsAuthenticationEventArgs e) 
{ 
    // ensure we have a name and made it through authentication 
    if (e.Identity != null && e.Identity.IsAuthenticated) 
    { 
     //create your principal, pass in the identity so you know what permissions are tied to 
     MyCustomePrincipal opPrincipal = new MyCustomePrincipal(e.Identity);    
     //assign your principal to the HttpContext.Current.User, or perhaps Thread.Current 
     HttpContext.Current.User = opPrincipal;  
    } 
} 

私は承認がPrincipalPermissionに後日来たと考えているが、私はとき/なぜ私は怖い:(違いのにように、あまりにもわからないんだけど - 申し訳ありません

+0

私はそれを与えるだろう試してください、高速応答ありがとう:) –

+0

ああ、ありがとうございます!あなたの答えはとても役に立ちました! :-) –

+0

問題はありません。うれしくて助かりました。私は最近非常に似たようなことをしなければならなかった!私の状況では、Windows Active Directoryの役割を使用したくない(管理者がそうした方法を管理したくないため)が、決定した場合にはそれらを使用できるようにするため、IPrincipal私たちのアプリの内部クラスとしてのユーザーアカウントを作成し、それに対するロールを固執するのではなく、物事の側面を説明します。 – dougajmcdonald

関連する問題