2009-06-26 4 views
0

ASMX Webサービスを使用する従来のwinforms VB.NET 1.1アプリケーションでは奇妙な状況に陥っています。 WindowsIdentityオブジェクトからパラメータとしてWebMethodにユーザートークンを送信しようとしています。私は 'HACK:comment'を追加します。.NET 1.1 WSDL - WebMethod(ASMX Webサービス)の入力パラメータとしてIntPtr(WindowsIdentity.Token)を使用できません。

System.Security.Principal.WindowsIdentity.GetCurrent().Token 

トークンはタイプのIntPtrであり、最初の問題は、WSDLが生成されている「サポートされていない型」

の誤差でのIntPtrをサポートしていない私は、これは大きなWTFの質問で承知していると安全でないと思われるので、単純な有用な選択肢は大歓迎ですが、ホスティング環境の複雑さを含めて、このシステムをどのように変更できるかには多くの制約があります。だから私は、他の頭痛の多くを保存するために、私たちのデータをWebサービスに渡したいと思っています。 WSDLの生成から

問題1

エラー:

Method userClass.TestSendIntPtr can not be reflected. 
--> There was an error reflecting 'token'. 
--> System.IntPtr is an unsupported type. 

(WTF率を拡張する)別のアプローチ - のIntPtr問題を回避しようとしているだけで、システムへのIntPtrを置くことですサービスにリサイズアプリ端部に

BinaryFormatter.Serialize() 

を用いてBF.Deserialize().IO.Stream。しかし、これは新しい奇妙な問題につながる。

この方法でWebサービスメソッドのシグネチャを定義する:

Public Class UserService 
    Inherits System.Web.Services.WebService 

    <WebMethod()> _ 
    Public Function UserToken(ByVal tokenStream As System.IO.Stream) As Boolean 

ストリームの「System.IO」資格は無視されているかのように、新たな奇妙な問題は、コンパイルエラーとしてクライアント側で発生し、そして

問題2

Value of type 'System.IO.Stream' cannot be converted to 'USERSERVICE.Stream'. 

... UserServiceのクラスの一部として解釈されていますしたがって、どちらかの質問に対する答え、または同様の代替アプローチは素晴らしいでしょう...

+0

私たちがWCFを使用していただけでは問題はありませんが、これはレガシーシステム上の単なるパッチであり、堅実な改善の余地はありません。 –

答えて

1

WSDLでのサポートの欠如のためにIntPtrが機能しない場合は、代わりにLongを使用してください。 IntPtrはInteger型とLong型との間で変換可能です。これらの型の1つとして値を渡すだけで(できればLong)、もう一方の端に戻すことができます。

ロング

からロング

Dim value As Long = token.ToInt64() 

変換するために、あなたがが注意トークン値を作成したプロセスのアドレス空間でのみ有効であるということであるべきで

Dim token as IntPtr = new IntPtr(value) 

一つのことに変換します。別のプロセスに存在するWebサービスを介して値を渡す場合、トークンは証明値を持ちません。同じ物理アドレスを持ちますが、そのトークンに対して値を照会することはできません。

+0

JaredParに感謝します。トークンを送信することは役に立たないでしょう。サービス上のWindowsIdentityを再作成しようとしました。統合セキュリティのために正しく設定されているWebサービスへの接続を妨げるその他の問題があるからです。それを再現することは賢明でも実用的でも達成可能ではありません。なぜこれが間違った方法であるかをサポートする答えを提供する時間をとってくれてありがとう。 –

+0

私はこれが古い質問だと知っていますが、私は何とか同じような状況にあります。私の「操作」はすべて同じマシンで起こっています。ログイン時にWindowsIdenityトークンを指すIntPtrを作成する必要があります。私の最初の考えは、IntPtrを使用してWindowsIdentityを作成してこのユーザーを偽装することができるように、このIntPtrをOAuthトークンに '保持'することです。それは、すべてが1台のマシンで起こっていることを考慮すると、まだ実行可能な解決策でしょうか?ありがとう。 –

関連する問題