BUG: MTS Impersonation Returns Incorrect Caller When Using RDSID: Q184702
|
When using Remote Data Service (RDS) to call a local or remote COM server,
the server only recognizes the first caller into the object. If subsequent
calls are made to the object by different clients, the server only
impersonates them as the initial caller. This behavior has some far reaching side effects that can cause serious security problems. For example, it renders the Microsoft Transaction Server (MTS) role based security model unusable with RDS. It also causes the MTS ISecurityProperty interfaces to return incorrect information.
The Windows NT 4.0 Service Pack 4 (SP4) changes the behavior slightly. When the service pack is installed on a computer, the caller will be seen as the
process identity if the MTS package is set to run as a server process
on the same computer as the Internet Information Server (IIS). In most
cases the identity will be that of the system account (NT_AUTHORITY\SYSTEM).
This is a limitation of COM on the current Windows platforms. COM does not
support clients that impersonate many different users such as IIS. The
problem is that for performance reasons, COM caches remote procedure call (RPC) connections. In doing so, it also caches authentication information. This caching causes COM security to incorrectly report identities if the client impersonates many different users.
The behavior in Windows NT 4.0 was to simply show the identity of the
first caller for the duration of the connection. Since the connections
timeout after a period of 2 minutes of inactivity, you could see a
somewhat random identity at the server.
To partially correct this in SP4, the COM behavior was changed to always
report the process identity for local calls. Remote calls behave the same.
While far from optimal, it at least allows the server to reliably obtain
some client identity.
There is currently no workaround for this problem in the general case. However a hotfix is available for RDS 2.1 calling MTS 2.0 components. Please contact Microsoft Product Support for more information on this hotfix.
Microsoft has confirmed this to be a bug in the Microsoft products listed at the beginning of this article.
Public Function WhoAmI() As String
On Error GoTo handler
WhoAmI = GetObjectContext.Security.GetDirectCallerName
Exit Function
handler:
WhoAmI = "Error"
End Function
a. To add the component to Microsoft Transaction Server (MTS) open the MTS Management Console.
b. Expand the Microsoft Transaction Server and then the My Computer
directories.
c. Select Packages Installed, then right-click and select New and
Package.
d. Click Create an Empty Package.
e. Enter MTSRDS for the package name and click Next.
f. Click Finish on the following page excepting the page defaults.
You now have a MTS package named MTSRDS.
g. To add the component to the MTSRDS Package expand the MTSRDS
package and select Components. Right-click and select
New and Component.
h. Click Install New Component, and then select Add File. Locate the
Whocalled.dll, select it, and click Open and then Finish.
HKEY_LOCAL_MACHINE\SYSTEM
\CurrentControlSet\Services\W3SVC\Parameters\ADCLaunch
(Place one command button and one label control on a form)
Dim myobj As Object
Private Sub Command1_Click()
label1.Caption = myobj.WhoAmI
End Sub
Private Sub Form_Load()
Set ds = CreateObject("RDS.DataSpace")
Set myobj = ds.CreateObject("WhoCalled.clsWho", _
"http://IISServerName")
End Sub
NOTE: Change the IISServerName to your IIS Server name.
Additional query words: kbdse
Keywords :
Version : WINDOWS:1.5
Platform : WINDOWS
Issue type : kbbug
Last Reviewed: February 16, 1999