2012-05-26 16 views
10

MVC3 WebアプリケーションでForms認証とWindows認証の両方に対してユーザー権限昇格を実装する必要がありますが、Windows認証ではこの問題が重要です。これは、より高い権限を持つユーザがより低い権限を持つユーザ、例えば事務ユーザがタスクを実行しており、事務ユーザが続行できるようにするために管理ユーザがタスクを実行する必要がある場合、管理ユーザは同じセッションをその特権レベルに昇格させ、管理タスクを実行し、セッションに私はここでは、法律上のユーザのログオフと管理ユーザのログオンを行わずに、ここでは方法を見ていません。たぶん、ユーザーの切り替えは全く新しいセッションよりも丁寧ですが、私はWindows認証のWebアプリケーションと同等の機能を「実行」したいと思っています。Windows認証付きMVC3 Webアプリケーションの権限昇格

これも可能ですか、もしそうなら、どうしたらいいですか?私はどこから見始めてもわからない。

答えて

3

あなたはあなたのサイトのどこかにアンカーを置くことができます:

@Html.ActionLink("elevate to admin", "SwitchToAdmin", "Home") 

をして、管理者の資格情報を入力することができますコントローラのアクションがあります。元に戻すプロセスが逆になります

public ActionResult SwitchToAdmin() 
{ 
    // TODO: Adjust the role name that your administrators will have 
    if (!User.IsInRole(@"DOMAIN\Administrators")) 
    { 
     // The user is not currently an admin => popup a Logon box 
     // so that the administrator could authenticate himself 
     return new HttpUnauthorizedResult(); 
    } 
    else 
    { 
     // After inputting the correct username and password for the 
     // admin, we can now redirect to the home action and start performing 
     // the admin tasks 
     return RedirectToAction("index", "home"); 
    } 
} 

を。ユーザーが管理者で、普通のユーザーがユーザー名とパスワードを入力できるようにする場合、401を投げるコントローラー・アクションを呼び出すリンクを持つことができます。

+0

Windows認証では、現在ログインしているユーザーが使用され、資格情報の入力を求められません。少なくとも私のMVCアプリでは、それはどのように動作するのですか?書いたように動作させる方法はありますか?私のアプリのいくつかをテストするのに役立つだろう。 –

+0

401ステータスコードを返すと、ブラウザは現在接続されているユーザを*切り替えるための資格情報を要求します。もちろん、ブラウザに依存しているので、ポップアップするログオンボックスを制御することはできません。 –

+0

それは私のために働いていない、私はどんなプロンプトも得られない。私はもう少し調べてみるつもりですが、フォームとウィンドウ認証を使用し、フォーム認証部分がこのページに従って401を引き継ぐ可能性があるため、OPの問題にはうまくいかないと付け加えたいと思います: http://weblogs.asp.net/jgalloway/archive/2011/04/28/looking-at-how-asp-net-mvc-authorize-interacts-with-asp-net-forms-authorization.aspx –

5

「パワーユーザー」に他のユーザーの特定の役割を一時的に設定させたり、たとえば、DateTimeを使用して役割の有効期限を設定することもできます。私が思うに、これを行うには、Windows認証を使用するためには

+0

この回答を参考に、通常のユーザーがログオフする必要なく、同じマシンでパワーユーザーにアクセスするにはどうすればよいですか? – ProfK

+0

Bobが一時的に昇格されている間に管理テーブルをロックすることによって、管理者AdamがユーザーBob管理者役割を与え、BobがSally管理者役割を与えるリスクを軽減できます。 – RickAndMSFT

+0

@RickAndMSFTありがとうございます。しかし、ボブのマシンでAdamがBobのプロモーションにどのようにアクセスできますか?それが私の質問の要点です。 – ProfK

1

次のものが必要です。

  • run asコマンド
  • ユーザのデスクトップ上のショートカットがに他のログオン
  • バッチスクリプトのいずれかを開始しますユーザーのログオン情報を求めるプロンプトまたは別のデスクトッププログラムを使用して情報を収集する(これらのショートカットはユーザーが選択します)
  • run asコマンドラインの情報が準備できたら、ブラウザを起動したり、ブラウザに埋め込まれたカスタムプログラムを起動したりすることができます。

ブラウザの組み込み方法を使用したプログラムの利点は、タイムアウト後に強制的に閉じるなどの特別なセキュリティ上の注意を払うことができることです。

とにかく可能な解決策の1つです。また、ビジネスニーズを解決するための複雑ではない方法を考え出すこともできます。おそらく管理者のためのリモートデスクトップセッションですか?

+0

うわー、ありがとう@オースティン、私はあなたの入力を感謝します。これはおじいちゃんの些細な要件ですが、私はあなたが正しいと思いますが、私は組み込みのブラウザやリモートセッションより簡単な解決策を見つけることができます。私の木材を震わせよう。 – ProfK

1

run asコマンドに相当するのは、ユーザー偽装です。これは、別のユーザーとしてより高い特権を必要とするコマンドを実行しています。 以下のように動作するはずです。 1)ユーザーが特権リソースにアクセスしようとしました。 Webアプリケーションはこれを検出します。これは、すべてのタスクがより高い特権を獲得しているような種類のテーブルを持っているか、操作を実行しようとするセキュリティ例外を傍受しているためです。 2)これが検出されると、 "RequiresPrivilegesElevationException"(定義する必要がある例外)がスローされます。コントローラがキャッチしたこの例外は、ユーザにより高い特権を要求する必要があることがわかっている 3)コントローラがadmin(またはより高い特権のユーザパスワード)をユーザに入力するように促す 4)ユーザがcredentilas(https経由)資格情報は偽装コンテキストを作成するために使用され、すべての操作はこの偽装コンテキスト内で実行されます。

このアプローチの欠点は、資格情報と特権の昇格がサーバーへのたった1回の旅行で最後になることです。他の要求については、ユーザーは資格情報を再挿入する必要があります。

+0

素敵な考え方ユーザーの偽装は興味深いアプローチです。しかしもう一つの欠点は、あなたがシステムレベルであなたのためにそれを処理するのではなく、アプリケーションレベルで資格情報を収集していることです。 –

+0

あまりにも多くのオプションがありません:ユーザーがすでに特権を持っていて、彼がそれを使用したいと確信するだけで、または彼はcredentilasを提供する必要があります。第2のケースでは、許可チケットは、クライアント上またはサーバ上で作成されてもよい。 3つの論理オプション!ケース1は扱いが簡単です。新しいクレデンタを必要とせずに私の回答ですでに説明したのと同じことをやってください。ただ確認(偽の確認を避けるためのhttps)。クライアント上でチケットを作成するには、クライアント上で偽装を行う必要があり、ブラウザに追加のソフトウェアを追加する必要があります。 –

関連する問題