472,807 Members | 1,610 Online
Bytes | Software Development & Data Engineering Community
Post Job

Home Posts Topics Members FAQ

Join Bytes to post your question to a community of 472,807 software developers and data experts.

Impersonate asp application to run like IIS basic authentication.

Hi,
I need to build and asp page which access a remote windows server's
registry and create a registry key.
In order for the ASP page to be able to access the registry on the
remote server I need it to run using credentials supplied by the user.
When using basic authentication this is not an issue since the user
has to provide a user name and password.
But I don't want to use basic authentication so I created a login form
and I am using FORMS authentication to force the user to login.
The problem is that was unable to force the asp application to
impersonate to the user who logged in to the application.
Any help on this would be appreciated.
Thanks,
Erez.
Nov 18 '05 #1
6 2329
Basic auth uses a credential store from the machine or the domain. Forms
auth is completely separate to this and does not use any form of credential
store apart from either the web.config or what you do in code to verify the
credentials. Using impersonation will probably just impersonate the local
ASPNET account (under which ASP.NET runs).

--
- Paul Glavich
"Erez Shor" <er*******@intel.com> wrote in message
news:54**************************@posting.google.c om...
Hi,
I need to build and asp page which access a remote windows server's
registry and create a registry key.
In order for the ASP page to be able to access the registry on the
remote server I need it to run using credentials supplied by the user.
When using basic authentication this is not an issue since the user
has to provide a user name and password.
But I don't want to use basic authentication so I created a login form
and I am using FORMS authentication to force the user to login.
The problem is that was unable to force the asp application to
impersonate to the user who logged in to the application.
Any help on this would be appreciated.
Thanks,
Erez.

Nov 18 '05 #2
This is exactly what I am seeing.
So is there any other way I can have my application access the remote
server using a logged in account and not the local machine account?
Erez.
"Paul Glavich" <gl**@aspalliance.com-NOSPAM> wrote in message news:<#c*************@TK2MSFTNGP11.phx.gbl>...
Basic auth uses a credential store from the machine or the domain. Forms
auth is completely separate to this and does not use any form of credential
store apart from either the web.config or what you do in code to verify the
credentials. Using impersonation will probably just impersonate the local
ASPNET account (under which ASP.NET runs).

--
- Paul Glavich
"Erez Shor" <er*******@intel.com> wrote in message
news:54**************************@posting.google.c om...
Hi,
I need to build and asp page which access a remote windows server's
registry and create a registry key.
In order for the ASP page to be able to access the registry on the
remote server I need it to run using credentials supplied by the user.
When using basic authentication this is not an issue since the user
has to provide a user name and password.
But I don't want to use basic authentication so I created a login form
and I am using FORMS authentication to force the user to login.
The problem is that was unable to force the asp application to
impersonate to the user who logged in to the application.
Any help on this would be appreciated.
Thanks,
Erez.

Nov 18 '05 #3
This is exactly what I am seeing.
So is there any other way I can have my application access the remote
server using a logged in account and not the local machine account?
Erez.
"Paul Glavich" <gl**@aspalliance.com-NOSPAM> wrote in message news:<#c*************@TK2MSFTNGP11.phx.gbl>...
Basic auth uses a credential store from the machine or the domain. Forms
auth is completely separate to this and does not use any form of credential
store apart from either the web.config or what you do in code to verify the
credentials. Using impersonation will probably just impersonate the local
ASPNET account (under which ASP.NET runs).

--
- Paul Glavich
"Erez Shor" <er*******@intel.com> wrote in message
news:54**************************@posting.google.c om...
Hi,
I need to build and asp page which access a remote windows server's
registry and create a registry key.
In order for the ASP page to be able to access the registry on the
remote server I need it to run using credentials supplied by the user.
When using basic authentication this is not an issue since the user
has to provide a user name and password.
But I don't want to use basic authentication so I created a login form
and I am using FORMS authentication to force the user to login.
The problem is that was unable to force the asp application to
impersonate to the user who logged in to the application.
Any help on this would be appreciated.
Thanks,
Erez.

Nov 18 '05 #4
You can do a couple of things. In code, you can manually impersonate
(WindowsIdentity.Impersonate() / WindowsImpersonationContext class) a user
and access the remote server, or you can specify this user within the
web.config file. Something like :-

<identity impersonate="true" userName="domain\username"
password="password"/>

--
- Paul Glavich
"Erez Shor" <er*******@intel.com> wrote in message
news:54**************************@posting.google.c om...
This is exactly what I am seeing.
So is there any other way I can have my application access the remote
server using a logged in account and not the local machine account?
Erez.
"Paul Glavich" <gl**@aspalliance.com-NOSPAM> wrote in message

news:<#c*************@TK2MSFTNGP11.phx.gbl>...
Basic auth uses a credential store from the machine or the domain. Forms
auth is completely separate to this and does not use any form of credential store apart from either the web.config or what you do in code to verify the credentials. Using impersonation will probably just impersonate the local ASPNET account (under which ASP.NET runs).

--
- Paul Glavich
"Erez Shor" <er*******@intel.com> wrote in message
news:54**************************@posting.google.c om...
Hi,
I need to build and asp page which access a remote windows server's
registry and create a registry key.
In order for the ASP page to be able to access the registry on the
remote server I need it to run using credentials supplied by the user.
When using basic authentication this is not an issue since the user
has to provide a user name and password.
But I don't want to use basic authentication so I created a login form
and I am using FORMS authentication to force the user to login.
The problem is that was unable to force the asp application to
impersonate to the user who logged in to the application.
Any help on this would be appreciated.
Thanks,
Erez.

Nov 18 '05 #5
Paul,
I know I can use the web.config file but then the account used is
constant and I want it to change using the user name logged in it to
the application.
As for WindowsImpersonationContext I tried using it but was unable to
get it to work. What I did was to use forms authentication and use
WindowsIdentity.Impersonate(User.Identity.Name.ToS tring()) but I
received a cast error.
Do you have a code example which works?
Erez.
"Paul Glavich" <gl**@aspalliance.com-NOSPAM> wrote in message news:<#2**************@TK2MSFTNGP10.phx.gbl>...
You can do a couple of things. In code, you can manually impersonate
(WindowsIdentity.Impersonate() / WindowsImpersonationContext class) a user
and access the remote server, or you can specify this user within the
web.config file. Something like :-

<identity impersonate="true" userName="domain\username"
password="password"/>

--
- Paul Glavich
"Erez Shor" <er*******@intel.com> wrote in message
news:54**************************@posting.google.c om...
This is exactly what I am seeing.
So is there any other way I can have my application access the remote
server using a logged in account and not the local machine account?
Erez.
"Paul Glavich" <gl**@aspalliance.com-NOSPAM> wrote in message

news:<#c*************@TK2MSFTNGP11.phx.gbl>...
Basic auth uses a credential store from the machine or the domain. Forms
auth is completely separate to this and does not use any form of credential store apart from either the web.config or what you do in code to verify the credentials. Using impersonation will probably just impersonate the local ASPNET account (under which ASP.NET runs).

--
- Paul Glavich
"Erez Shor" <er*******@intel.com> wrote in message
news:54**************************@posting.google.c om...
> Hi,
> I need to build and asp page which access a remote windows server's
> registry and create a registry key.
> In order for the ASP page to be able to access the registry on the
> remote server I need it to run using credentials supplied by the user.
> When using basic authentication this is not an issue since the user
> has to provide a user name and password.
> But I don't want to use basic authentication so I created a login form
> and I am using FORMS authentication to force the user to login.
> The problem is that was unable to force the asp application to
> impersonate to the user who logged in to the application.
> Any help on this would be appreciated.
> Thanks,
> Erez.

Nov 18 '05 #6
You have to do a little bit more than that. Below is some code that is taken
directly from the MSDN library.

If you have the MSDN library or Visual Studio.NET installed, you should be
able to paste the link below into a browser or the MSDN address bar and get
the same.

Link is :
ms-help://MS.MSDNQTR.2003FEB.1033/cpref/html/frlrfsystemsecurityprincipalwin
dowsimpersonationcontextclasstopic.htm
**************Code Sample Below*********************
// This sample demonstrates the use of the WindowsIdentity class to
impersonate a user.
// IMPORTANT NOTES:
// This sample can be run only on Windows XP. The default Windows 2000
security policy
// prevents this sample from executing properly, and changing the policy to
allow
// proper execution presents a security risk.
// This sample requests the user to enter a password on the console screen.
// Because the console window does not support methods allowing the password
to be masked,
// it will be visible to anyone viewing the screen.

using System;
using System.Runtime.InteropServices;
using System.Security.Principal;
using System.Security.Permissions;

[assembly:SecurityPermissionAttribute(SecurityActio n.RequestMinimum,
UnmanagedCode=true)]
[assembly:PermissionSetAttribute(SecurityAction.Req uestMinimum, 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=System.Runtime.InteropServices.CharSet.Aut o)]
private unsafe static extern int FormatMessage(int dwFlags, ref IntPtr
lpSource,
int dwMessageId, int dwLanguageId, ref String lpBuffer, int nSize,
IntPtr *Arguments);

[DllImport("kernel32.dll", CharSet=CharSet.Auto)]
public extern static bool CloseHandle(IntPtr handle);

[DllImport("advapi32.dll", CharSet=CharSet.Auto, SetLastError=true)]
public extern static bool DuplicateToken(IntPtr ExistingTokenHandle,
int SECURITY_IMPERSONATION_LEVEL, ref IntPtr DuplicateTokenHandle);
// GetErrorMessage formats and returns an error message
// corresponding to the input errorCode.
public unsafe static string GetErrorMessage(int errorCode)
{
int FORMAT_MESSAGE_ALLOCATE_BUFFER = 0x00000100;
int FORMAT_MESSAGE_IGNORE_INSERTS = 0x00000200;
int FORMAT_MESSAGE_FROM_SYSTEM = 0x00001000;

int messageSize = 255;
String lpMsgBuf = "";
int dwFlags = FORMAT_MESSAGE_ALLOCATE_BUFFER |
FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS;

IntPtr ptrlpSource = IntPtr.Zero;
IntPtr prtArguments = IntPtr.Zero;

int retVal = FormatMessage(dwFlags, ref ptrlpSource, errorCode, 0,
ref lpMsgBuf, messageSize, &prtArguments);
if (0 == retVal)
{
throw new Exception("Failed to format message for error code " +
errorCode + ". ");
}

return lpMsgBuf;
}

// 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);
IntPtr dupeTokenHandle = new IntPtr(0);
try
{
string UserName, MachineName;

// Get the user token for the specified user, machine, and
password using the
// unmanaged LogonUser method.

Console.Write("Enter the name of a machine on which to log on:
");
MachineName = Console.ReadLine();

Console.Write("Enter the login of a user on {0} that you wish to
impersonate: ", MachineName);
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;
const int SecurityImpersonation = 2;

tokenHandle = IntPtr.Zero;
dupeTokenHandle = IntPtr.Zero;

// Call LogonUser to obtain a handle to an access token.
bool returnValue = LogonUser(UserName, MachineName,
Console.ReadLine(),
LOGON32_LOGON_INTERACTIVE, 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);
Console.WriteLine("\nError: [{0}] {1}\n", ret,
GetErrorMessage(ret));

return;
}

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);

bool retVal = DuplicateToken(tokenHandle, SecurityImpersonation,
ref dupeTokenHandle);
if (false == retVal)
{
CloseHandle(tokenHandle);
Console.WriteLine("Exception thrown in trying to duplicate
token.");
return;
}

// The token that is passed to the following constructor must
// be a primary token in order to use it for impersonation.
WindowsIdentity newId = new WindowsIdentity(dupeTokenHandle);
WindowsImpersonationContext impersonatedUser =
newId.Impersonate();

// Check the identity.
Console.WriteLine("After impersonation: "
+ WindowsIdentity.GetCurrent().Name);

// Stop impersonating the user.
impersonatedUser.Undo();

// Check the identity.
Console.WriteLine("After Undo: " +
WindowsIdentity.GetCurrent().Name);

// Free the tokens.
if (tokenHandle != IntPtr.Zero)
CloseHandle(tokenHandle);
if (dupeTokenHandle != IntPtr.Zero)
CloseHandle(dupeTokenHandle);
}
catch(Exception ex)
{
Console.WriteLine("Exception occurred. " + ex.Message);
}

}
}
--
- Paul Glavich
"Erez Shor" <er*******@intel.com> wrote in message
news:54**************************@posting.google.c om...
Paul,
I know I can use the web.config file but then the account used is
constant and I want it to change using the user name logged in it to
the application.
As for WindowsImpersonationContext I tried using it but was unable to
get it to work. What I did was to use forms authentication and use
WindowsIdentity.Impersonate(User.Identity.Name.ToS tring()) but I
received a cast error.
Do you have a code example which works?
Erez.
"Paul Glavich" <gl**@aspalliance.com-NOSPAM> wrote in message

news:<#2**************@TK2MSFTNGP10.phx.gbl>...
You can do a couple of things. In code, you can manually impersonate
(WindowsIdentity.Impersonate() / WindowsImpersonationContext class) a user and access the remote server, or you can specify this user within the
web.config file. Something like :-

<identity impersonate="true" userName="domain\username"
password="password"/>

--
- Paul Glavich
"Erez Shor" <er*******@intel.com> wrote in message
news:54**************************@posting.google.c om...
This is exactly what I am seeing.
So is there any other way I can have my application access the remote
server using a logged in account and not the local machine account?
Erez.
"Paul Glavich" <gl**@aspalliance.com-NOSPAM> wrote in message

news:<#c*************@TK2MSFTNGP11.phx.gbl>...
> Basic auth uses a credential store from the machine or the domain. Forms > auth is completely separate to this and does not use any form of

credential
> store apart from either the web.config or what you do in code to verify
the
> credentials. Using impersonation will probably just impersonate the

local
> ASPNET account (under which ASP.NET runs).
>
> --
> - Paul Glavich
>
>
> "Erez Shor" <er*******@intel.com> wrote in message
> news:54**************************@posting.google.c om...
> > Hi,
> > I need to build and asp page which access a remote windows

server's > > registry and create a registry key.
> > In order for the ASP page to be able to access the registry on the
> > remote server I need it to run using credentials supplied by the user. > > When using basic authentication this is not an issue since the user > > has to provide a user name and password.
> > But I don't want to use basic authentication so I created a login form > > and I am using FORMS authentication to force the user to login.
> > The problem is that was unable to force the asp application to
> > impersonate to the user who logged in to the application.
> > Any help on this would be appreciated.
> > Thanks,
> > Erez.

Nov 18 '05 #7

This thread has been closed and replies have been disabled. Please start a new discussion.

Similar topics

8
by: Michelle | last post by:
Hello! I have an ASP.NET application (1.1 framework) that needs to be able to read/write files on a network share. The access to this file share will be fairly restricted, so I need to...
8
by: BLiTZWiNG | last post by:
After playing with the code shown and utilising Willy Denyottes' help, I have come to the conclusion that there is some form of difference between the managed WindowsIdentity.Impersonate() over the...
4
by: John Smith | last post by:
Hey folks, I'm trying to use the HttpWebResponse object in an ASP application, but I get a 401 unauthorized error on this line: HttpWebResponse response =...
0
by: William F. Robertson, Jr. | last post by:
On page: http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnnetsec/ht ml/thcmch19.asp Microsoft discusses the drawbacks of impersonating the original caller. I am especially...
4
by: Alvaro Pereira | last post by:
I have a ASP.NET project that prints a report to a NETWORK- PRINTER. I have impersonate=true in my web.config, but all reports are printed under ASPNET user (the one that is setted in...
6
by: Mark | last post by:
We are attempting to use impersonation to connect from our ASP.NET website to a SQL Server on the same domain. The code below works just fine in our web.config file: <identity impersonate="true"...
6
by: Bjoern Wolfgardt | last post by:
Hi NG, I have written some Apps in ASP.NET that access a SQL Server on another machine. I never had a problem doing this in IIS5(.1). Most Apps are Intranet Application where I use the...
4
by: Paul | last post by:
just wondering what could cause identity impersonate = true to not work on a server? It works on my development machine but when I try it on a server that has the framework installed it does not...
2
by: KaNos | last post by:
Hello world, I've made a webservice (c# v2) to install in a server IIS 6 on a Windows 2000 last SP. We can use the webservice in local, throw the pages wich present the methods, with a windows...
2
isladogs
by: isladogs | last post by:
The next Access Europe meeting will be on Wednesday 2 August 2023 starting at 18:00 UK time (6PM UTC+1) and finishing at about 19:15 (7.15PM) The start time is equivalent to 19:00 (7PM) in Central...
0
by: erikbower65 | last post by:
Using CodiumAI's pr-agent is simple and powerful. Follow these steps: 1. Install CodiumAI CLI: Ensure Node.js is installed, then run 'npm install -g codiumai' in the terminal. 2. Connect to...
0
by: erikbower65 | last post by:
Here's a concise step-by-step guide for manually installing IntelliJ IDEA: 1. Download: Visit the official JetBrains website and download the IntelliJ IDEA Community or Ultimate edition based on...
0
by: kcodez | last post by:
As a H5 game development enthusiast, I recently wrote a very interesting little game - Toy Claw ((http://claw.kjeek.com/))。Here I will summarize and share the development experience here, and hope it...
0
by: Taofi | last post by:
I try to insert a new record but the error message says the number of query names and destination fields are not the same This are my field names ID, Budgeted, Actual, Status and Differences ...
0
by: Rina0 | last post by:
I am looking for a Python code to find the longest common subsequence of two strings. I found this blog post that describes the length of longest common subsequence problem and provides a solution in...
5
by: DJRhino | last post by:
Private Sub CboDrawingID_BeforeUpdate(Cancel As Integer) If = 310029923 Or 310030138 Or 310030152 Or 310030346 Or 310030348 Or _ 310030356 Or 310030359 Or 310030362 Or...
0
by: lllomh | last post by:
How does React native implement an English player?
2
by: DJRhino | last post by:
Was curious if anyone else was having this same issue or not.... I was just Up/Down graded to windows 11 and now my access combo boxes are not acting right. With win 10 I could start typing...

By using Bytes.com and it's services, you agree to our Privacy Policy and Terms of Use.

To disable or enable advertisements and analytics tracking please visit the manage ads & tracking page.