- - PR -
偽装を実装させる
1
投稿者 | 投稿内容 | ||||||||
---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2004-05-11 16:40
いつもお世話になっております。
ASP.NETで画面にユーザID、ドメイン、パスワードを入力し、コーディングで偽装認証を行いたい、他のPCのフォルダにアクセスしたいのですが、サンプルプログラムなどを参照してもいまいちうまくいきません。 サンプルプログラム ↓ Dim LOGON32_LOGON_INTERACTIVE As Integer = 2 Dim LOGON32_PROVIDER_DEFAULT As Integer = 0 Dim impersonationContext As WindowsImpersonationContext Declare Auto Function LogonUser Lib "advapi32.dll" (ByVal lpszUsername As String, _ ByVal lpszDomain As String, _ ByVal lpszPassword As String, _ ByVal dwLogonType As Integer, _ ByVal dwLogonProvider As Integer, _ ByRef phToken As IntPtr) As Integer Declare Auto Function DuplicateToken Lib "advapi32.dll" _ (ByVal ExistingTokenHandle As IntPtr, _ ImpersonationLevel As Integer, _ ByRef DuplicateTokenHandle As IntPtr) As Integer Public Sub Page_Load(s As Object, e As EventArgs) If impersonateValidUser("username", "domain", "password") Then '特定のユーザーのセキュリティ コンテキストで実行するコードをここに挿入します。 undoImpersonation() Else '偽装が失敗した場合の安全策としての機構をここに記述します。 End If End Sub Private Function impersonateValidUser(userName As String, _ domain As String, password As String) As Boolean Dim tempWindowsIdentity As WindowsIdentity Dim token As IntPtr Dim tokenDuplicate As IntPtr If LogonUser(userName, domain, password, LOGON32_LOGON_INTERACTIVE, _ LOGON32_PROVIDER_DEFAULT, token) <> 0 Then If DuplicateToken(token, 2, tokenDuplicate) <> 0 Then tempWindowsIdentity = new WindowsIdentity(tokenDuplicate) impersonationContext = tempWindowsIdentity.Impersonate() If impersonationContext Is Nothing Then impersonateValidUser = False Else impersonateValidUser = True End If Else impersonateValidUser = False End If Else impersonateValidUser = False End If End Function Private Sub undoImpersonation() impersonationContext.Undo() End Sub 大変初歩的な質問なのですが このサンプルプログラムで使われているuserName, domain, passwordは 偽装アクセス先のuserName, domain, passwordでよろしかったでしょうか? さらに、userName, domain, passwordは偽装アクセス先のフォルダの権限でしょうか? | ||||||||
|
投稿日時: 2004-05-11 16:55
306158 - [INFO] ASP.NET アプリケーションに偽装を実装するhttp://support.microsoft.com/default.aspx?scid=kb;ja;306158
このサンプルですね。 何がうまくいかないのでしょうか?
は試してみましたか?
サンプルを見る限りでは、そのようですね。 偽装するユーザーを指定し、フォルダにアクセスするのであれば、 そのフォルダに対して偽装するユーザーが適切な権限を持つ必要があります。 | ||||||||
|
投稿日時: 2004-05-11 23:34
ありがとうございます。
説明不足で申し訳ありません。 うまくいかない理由を詳しく説明します。 Webサービスを利用してサーバから特定のクライアントにあるMDBにアクセスをしたく、その際偽装を実装させたかったのです。 ご指摘がありました同じHP http://support.microsoft.com/default.aspx?scid=kb;ja;306158 を参考にして、WebConfigの <identity impersonate="true"/>の後にユーザIDとパスワードを設定して偽装してたところ、サーバから特定のクライアントのMDBにアクセスすることができました。 しかし、今回私が行いたいのは、webconfig やMachine.config を書き換えない方法で プログラムでサーバから特定のクライアントのMDBにアクセスを行いたいと思っています。 そして、アドバイスの通り、ASPNETアカウントに特権を与えてみましたが サーバから特定のクライアントのMDBにはアクセスできませんでした。 ------------------------------------------------------------------------------ この問題を回避するには、次のいずれかの方法を実行します。 ASPNET アカウントに "オペレーティング システムの一部として機能する" 特権を与えます。 ------------------------------------------------------------------------------ 逆にクライアントに設置した同じMDBをサーバに設置し、クライアントからサーバのMDBに接続できるか試してみました。 その結果、LogonUser(私が以前の書き込みしたサンプルプログラムのモジュール) のモジュールにサーバのユーザID、パスワード、ドメインを 引数で渡して実行させたところエラーにならなく、サーバに置いたMDBにも接続できました。 クライアントからサーバのMDBにアクセスでき、逆にサーバからクライアントのMDBに アクセスできないのは、クライアント側のセキュリティポリシーか何かの設定不足なのかLogonUserに渡す引数が違っているのかなのかではないかと思うのですが おこころ辺りがありましたら、ご教授お願いいたします。 | ||||||||
|
投稿日時: 2004-05-12 11:56
まず、はじめに、ドメイン環境ですか、ワークグループ環境ですか?
> Webサービスを利用してサーバから特定のクライアントにあるMDBにアクセスをしたく、その際偽装を実装させたかったのです。 「サーバから特定のクライアントにあるMDBにアクセス」とは、どういう手法でアクセスするんでしょうか? MDBはあまり詳しくないですが、クライアントの共有フォルダにあるMDBファイルをUNCパスかなんかで指定するんでしょうか? <identity impersonate="true"/> だとOKとなるということは、 プログラム上からの偽装でもOKになるはずですね。 > そして、アドバイスの通り、ASPNETアカウントに特権を与えてみましたが > サーバから特定のクライアントのMDBにはアクセスできませんでした。 > ------------------------------------------------------------------------------ > この問題を回避するには、次のいずれかの方法を実行します。 > ASPNET アカウントに "オペレーティング システムの一部として機能する" 特権を与えます。 > ------------------------------------------------------------------------------ エラーの内容はこれですか? んーとサーバー側にMDBファイルを置いた場合、サーバーのプログラムからMDBにアクセスできた。 クライアント側にMDBファイルを置いた場合、サーバーのプログラムからMDBにアクセスできない。 ということであってますか? |
1