1

Windows 認証とカスタム ロール プロバイダーを同時に使用しながら、ASP.NET アプリケーションに "Act As" 機能を実装しようとしています。基本的に私ができるようにしたいのは:

  • Windows 認証を使用して現在のユーザーのドメイン アカウントを取得し、承認されたドメイン ユーザーであることを確認します
  • カスタム ロール プロバイダーを使用して、SQL Server データベースから権限情報を取得します。
  • アプリケーションの管理者が実際にそのユーザーとしてアプリケーションにログインする必要なく、別のユーザーとして「行動」できるようにする機能を実装します。

私が実現しようとしているシナリオは、アプリケーション管理者が問題のあるユーザーを支援しようとしていて、「行動する」ボタンをクリックしてそのユーザーとして行動し、アプリケーションを彼らが見るように見るというものです。そのため、ロール プロバイダーは、現在のユーザーが別のユーザーとして行動していることを理解し、現在のユーザーではなくそのユーザーのアクセス許可情報を取得する必要があります。

私の計画は、ロール Cookie を削除し、ユーザーが現在別のユーザーになりすましていることを示す値をセッション変数に追加する偽装機能を実装することでした。ただし、承認が発生した時点でセッションが設定されていないため、これは不可能です。管理者のマシンで潜在的に永続的な状態を引き起こしたくないので、Cookie を使用したくありません (管理者がアプリの別のウィンドウを開いて、別のユーザーとして行動したり、自分のデータを表示したりできないなど) )。

セッションが利用できないことを考えると、「Acting as user...」情報を保存する良い方法が (Cookie なしで) 見つかりません。ロール プロバイダーなどを使用して、.NET に組み込まれているセキュリティ トリミングを活用したいと考えています。これはすべて不可能かもしれませんが、誰かが以前にこれを試したか、実装を試みることができる何かについて提案があることを願っています.

前もって感謝します!!

4

2 に答える 2

1

私は似たようなものを実装しました...あなたのシナリオとまったく同じではありませんが、かなり近いです。

  1. 管理者ログイン (管理者などの役割が 1 つある)

  2. 次に、管理者は「クライアントの選択」ページにリダイレクトされます。管理者は、ID、名前などでクライアントを検索できます。管理者はリストからクライアントを選択します。クライアント ID を Cookie に保存します。

  3. カスタムを呼び出すカスタム RolesProvider がありますGetRoles(loggedinUserid)

  4. GetRoles(int loggedinUserId)メソッドは、ユーザーのタイプ、つまり管理者か非管理者かを判断します。管理者の場合は、Cookie から ClientID を取得します。LoggedInUserID、typdofuser、および ClientId をストアド プロシージャに渡します。ストアド プロシージャは、管理者のすべてのロールとその ClientId のすべてのロールを返し、ロール プロバイダーに戻ります。

このようにして、管理者用のすべてのメニュー項目と、ClientID に必要なメニューを利用できます。

管理者はいつでも「クライアントの選択」ページに移動して、別のクライアントに切り替えることができます。クライアントを選択すると、新しい ClientId が Cookie に保存されます。

この後、次の 2 つのオプションがあります。

  1. リクエストごとに rolesprovider にこれを呼び出させるか、

  2. 取得したロールを HttpCache に保存し、ClientId が変更されるたびにこのキャッシュを更新します。

お役に立てれば。

于 2012-06-05T21:21:58.550 に答える
1

ここで同様の質問に対する私の回答を参照してください

その要点は次のとおりです。

私がこれを行った方法は、確かに少し粗雑ですが、偽装を行っているユーザーのログオン名と偽装したいユーザーのログオンを含む偽装テーブルをデータベースに作成することでした。

ユーザーが最初にページにアクセスしたときに (Windows 認証を使用)、そのユーザーがテーブルに偽装を設定しているかどうかを確認し、このユーザー ID をセッション状態のオブジェクトに配置するように、いくつかのオーバーライド コードを追加しました。 . 偽装がなければ、実際のユーザー ID をこの同じオブジェクトに配置します。

ユーザーのデータをそのまま処理しないようにするために、このオブジェクトには 2 つのプロパティがあります。1 つはコンテンツのカスタマイズのためにシステムで使用される logon_name 用で、もう 1 つはアクションをログに記録するときに使用される NameForLog と呼ばれます。 . 私が行うすべてのアクションは、私として記録されます。

ユーザーがカスタマイズしたコンテンツを表示するサイト上のすべての領域は、このセッション オブジェクトを参照するため、偽装 ID が常に使用され、ユーザーが見ているものを常に表示します。最初のページとログ記録コードを超えて、それが私であることさえ知りません。

このシナリオでは、ロール プロバイダーを実装し、GetRolesForUser をオーバーライドして、偽装ユーザーのロールと、偽装ユーザーが偽装機能をオフにする目的で偽装機能にアクセスできるようにするロールを返すことができます。

偽装したユーザーの役割を偽装したユーザーの役割で返すこともできます。これにより、管理者ユーザーが自分自身のすべての機能と偽装しているユーザーにアクセスできるようになります。あなたの特定のシナリオ。

于 2012-06-05T21:09:19.937 に答える