後で不確定な時間にユーザーに代わってコマンドをキューに入れて実行するWCFサービスがあります。私は、WindowsIdentityをバイト配列として格納し、それをデータベースに詰め込んでから、後でそのオブジェクトを逆シリアル化して使用することを望んでいました。
場合によっては、サービスは期待どおりに実行されます。つまり、ユーザーとしてコマンドを正しくシリアル化、保存、逆シリアル化、および実行します。また、WindowsIdentityを逆シリアル化すると、「呼び出しのターゲットによって例外がスローされました」というエラーが発生します。また、逆シリアル化は機能しますが、コマンド実行の途中で、IDが無効になる場合もあります。
私の質問はこれです:WCFを使用する.NET 4.0フレームワークで、明示的なユーザー名とパスワードなしで、後でユーザーに代わってコマンドを実行することは可能ですか?
私が使用しているコードは以下のとおりです。
シリアル化:
''' <summary>
''' Serializes a WindowsIdentity as a binary encoded byte array.
''' </summary>
''' <param name="identity">The identity to serialize.</param>
''' <returns>A byte array containing a binary representation of the identity.</returns>
Private Function SerializeWindowsIdentity(ByVal identity As WindowsIdentity) As Byte()
If IsNothing(identity) Then Return Nothing
Try
Dim bf As New BinaryFormatter
Using ms As New MemoryStream()
bf.Serialize(ms, identity)
Return ms.ToArray()
End Using
Catch ex As Exception
Return Nothing
End Try
End Function ' SerializeWindowsIdentity
デシリアライズ:
''' <summary>
''' Deserializes a WindowsIdentity from a binary encoded byte array.
''' </summary>
''' <param name="identity">A byte array containing a binary representation of a WindowsIdentity</param>
''' <returns>The deserialized WindowsIdentity from the byte array.</returns>
Private Function DeserializeWindowsIdentity(ByVal identity As Byte()) As WindowsIdentity
If IsNothing(identity) OrElse identity.Count = 0 Then Return Nothing
Try
Dim bf As New BinaryFormatter()
Using ms As New MemoryStream(identity)
Dim obj As Object = bf.Deserialize(ms)
Return CType(obj, WindowsIdentity)
End Using
Catch ex As Exception
Return Nothing
End Try
End Function ' DeserializeWindowsIdentity
WindowsIdentityキャプチャ:
identity = SerializeWindowsIdentity(ServiceSecurityContext.Current.WindowsIdentity)
使用法:
Dim cxt As WindowsImpersonationContext
Try
Dim wi As WindowsIdentity = DeserializeWindowsIdentity(identity)
If Not IsNothing(wi) Then cxt = wi.Impersonate()
' Do Stuff
Finally
If Not IsNothing(cxt) Then cxt.Dispose()
End If