- PR -

偽装を実装させる

1
投稿者投稿内容
momo
会議室デビュー日: 2004/05/09
投稿数: 3
投稿日時: 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は偽装アクセス先のフォルダの権限でしょうか?





dai
ベテラン
会議室デビュー日: 2001/08/28
投稿数: 85
投稿日時: 2004-05-11 16:55
306158 - [INFO] ASP.NET アプリケーションに偽装を実装するhttp://support.microsoft.com/default.aspx?scid=kb;ja;306158

このサンプルですね。
何がうまくいかないのでしょうか?
引用:
注 : あるスレッドで特定のユーザーを偽装するプロセスの ID は、"オペレーティング システムの一部として機能する" 特権を持つ必要があります。デフォルトでは、Aspnet_wp.exe のプロセスは ASPNET というコンピュータ アカウントで実行されます。しかし、このアカウントには特定のユーザーを偽装するために必要な特権がありません。特定のユーザーを偽装しようとすると、エラー メッセージが表示されます。

この問題を回避するには、次のいずれかの方法を実行します。
ASPNET アカウントに "オペレーティング システムの一部として機能する" 特権を与えます。
Aspnet_wp.exe プロセスを実行するアカウントを Machine.config ファイル の <processModel> 構成セクションにある System アカウントに変更します。



は試してみましたか?

引用:
このサンプルプログラムで使われているuserName, domain, passwordは
偽装アクセス先のuserName, domain, passwordでよろしかったでしょうか?
さらに、userName, domain, passwordは偽装アクセス先のフォルダの権限でしょうか?


サンプルを見る限りでは、そのようですね。
偽装するユーザーを指定し、フォルダにアクセスするのであれば、
そのフォルダに対して偽装するユーザーが適切な権限を持つ必要があります。
momo
会議室デビュー日: 2004/05/09
投稿数: 3
投稿日時: 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に渡す引数が違っているのかなのかではないかと思うのですが
おこころ辺りがありましたら、ご教授お願いいたします。





dai
ベテラン
会議室デビュー日: 2001/08/28
投稿数: 85
投稿日時: 2004-05-12 11:56
まず、はじめに、ドメイン環境ですか、ワークグループ環境ですか?

> Webサービスを利用してサーバから特定のクライアントにあるMDBにアクセスをしたく、その際偽装を実装させたかったのです。

「サーバから特定のクライアントにあるMDBにアクセス」とは、どういう手法でアクセスするんでしょうか?
MDBはあまり詳しくないですが、クライアントの共有フォルダにあるMDBファイルをUNCパスかなんかで指定するんでしょうか?

<identity impersonate="true"/> だとOKとなるということは、
プログラム上からの偽装でもOKになるはずですね。

> そして、アドバイスの通り、ASPNETアカウントに特権を与えてみましたが
> サーバから特定のクライアントのMDBにはアクセスできませんでした。
> ------------------------------------------------------------------------------
> この問題を回避するには、次のいずれかの方法を実行します。
> ASPNET アカウントに "オペレーティング システムの一部として機能する" 特権を与えます。
> ------------------------------------------------------------------------------
エラーの内容はこれですか?

んーとサーバー側にMDBファイルを置いた場合、サーバーのプログラムからMDBにアクセスできた。
クライアント側にMDBファイルを置いた場合、サーバーのプログラムからMDBにアクセスできない。
ということであってますか?
1

スキルアップ/キャリアアップ(JOB@IT)