C# 如何从代码中模拟webservice文件(asmx)?
直到最近,我还在web.config中使用了C# 如何从代码中模拟webservice文件(asmx)?,c#,web-services,impersonation,C#,Web Services,Impersonation,直到最近,我还在web.config中使用了”标记,后面是正确的凭据 现在我正在尝试添加另一个asmx文件,该文件将模拟到另一个帐户,并尝试从代码中执行此操作 问题是- 如何(在每次请求时)从asmx文件(webservice)中的代码模拟? (我用的是C#) 我猜代码应该在asmx类的ctor中,但我不确定应该是什么。 我在谷歌上搜索了很多例子,但还没有找到一个像样的代码来满足我的需求 提前谢谢你 如果您在web.config中将impersonate设置为ON,则可以通过以下方式指定不同的凭
”
标记,后面是正确的凭据
现在我正在尝试添加另一个asmx文件,该文件将模拟到另一个帐户,并尝试从代码中执行此操作
问题是-
如何(在每次请求时)从asmx文件(webservice)中的代码模拟?
(我用的是C#)
我猜代码应该在asmx类的ctor中,但我不确定应该是什么。
我在谷歌上搜索了很多例子,但还没有找到一个像样的代码来满足我的需求
提前谢谢你 如果您在web.config中将impersonate设置为ON,则可以通过以下方式指定不同的凭据:
new System.Net.NetworkCredential("username", "password", "domain");
我还发现了一篇好文章
它显示了如何将不同的WindowsIdentity附加到给定线程请参见示例代码:
using System;
using System.Runtime.InteropServices;
using System.Security.Principal;
using System.Security.Permissions;
[assembly: SecurityPermissionAttribute(SecurityAction.RequestMinimum, UnmanagedCode = true)]
[assembly: PermissionSetAttribute(SecurityAction.RequestMinimum, Name = "FullTrust")]
public class ImpersonationDemo
{
[DllImport("advapi32.dll", SetLastError = true)]
public static extern bool LogonUser(
String lpszUsername,
String lpszDomain,
String lpszPassword,
int dwLogonType,
int dwLogonProvider,
ref IntPtr phToken);
[DllImport("kernel32.dll", CharSet = CharSet.Auto)]
public extern static bool CloseHandle(IntPtr handle);
// Test harness.
// If you incorporate this code into a DLL, be sure to demand FullTrust.
[PermissionSetAttribute(SecurityAction.Demand, Name = "FullTrust")]
public static void Main(string[] args)
{
IntPtr tokenHandle = new IntPtr(0);
try
{
string userName, domainName;
// Get the user token for the specified user, domain, and password using the
// unmanaged LogonUser method.
// The local machine name can be used for the domain name to impersonate a user on this machine.
Console.Write("Enter the name of the domain on which to log on: ");
domainName = Console.ReadLine();
Console.Write("Enter the login of a user on {0} that you wish to impersonate: ", domainName);
userName = Console.ReadLine();
Console.Write("Enter the password for {0}: ", userName);
const int LOGON32_PROVIDER_DEFAULT = 0;
//This parameter causes LogonUser to create a primary token.
const int LOGON32_LOGON_INTERACTIVE = 2;
tokenHandle = IntPtr.Zero;
// Call LogonUser to obtain a handle to an access token.
bool returnValue = LogonUser(
userName,
domainName,
Console.ReadLine(),
3,
LOGON32_PROVIDER_DEFAULT,
ref tokenHandle);
Console.WriteLine("LogonUser called.");
if (false == returnValue)
{
int ret = Marshal.GetLastWin32Error();
Console.WriteLine("LogonUser failed with error code : {0}", ret);
throw new System.ComponentModel.Win32Exception(ret);
}
Console.WriteLine("Did LogonUser Succeed? " + (returnValue ? "Yes" : "No"));
Console.WriteLine("Value of Windows NT token: " + tokenHandle);
// Check the identity.
Console.WriteLine("Before impersonation: " + WindowsIdentity.GetCurrent().Name);
// Use the token handle returned by LogonUser.
WindowsIdentity newId = new WindowsIdentity(tokenHandle);
using (WindowsImpersonationContext impersonatedUser = newId.Impersonate())
{
// Check the identity. Here you shoul place code that will be executed on belaf of other login.
Console.WriteLine("After impersonation: " + WindowsIdentity.GetCurrent().Name);
GC.KeepAlive(impersonatedUser);
}
// Check the identity.
Console.WriteLine("After Undo: " + WindowsIdentity.GetCurrent().Name);
// Free the tokens.
if (tokenHandle != IntPtr.Zero)
CloseHandle(tokenHandle);
}
catch (Exception ex)
{
Console.WriteLine("Exception occurred. " + ex.Message);
}
}
}
非常感谢。如何将代码上下文模拟为我创建的新凭据?能否将应用程序池的凭据更改为要模拟为的用户?否,我需要在要模拟的不同用户之间来回切换,因此,应用程序池中的静态硬编码凭据在这里没有帮助…感谢您提供此代码示例。我在CodeProject上见过类似的东西。不幸的是,我需要为web服务模拟执行此操作,并且此代码引用了控制台应用程序…我已在web服务上下文中检查了此代码,但它不起作用。