Saya pernah berhasil membuat sekumpulan akun domain dengan kotak surat menggunakan program windows. Namun, ketika saya memberikan kode ini kepada salah satu rekan saya (dia bertanggung jawab untuk mengembangkan aplikasi web) dan memigrasikannya ke asp.net, itu hanya bisa Buat domain. akun, tidak dapat membuat kotak surat. Mengapa?
Kami berkonsultasi dengan insinyur Microsoft dan dia memberi tahu kami bahwa hal ini disebabkan oleh izin asp.net yang tidak mencukupi. Kami harus mensimulasikan pengguna di asp.net agar dapat berhasil dibuat.
Saya mengutip artikel yang relevan dari Microsoft:
Meniru identitas akun atau pengguna yang diautentikasi IIS
Untuk meniru pengguna yang diautentikasi Layanan Informasi Internet Microsoft (IIS) ketika setiap permintaan diterima untuk setiap halaman dalam aplikasi ASP.NET, Anda harus menyertakan dalam file Web.config untuk tag <identity> aplikasi ini dan atur atribut impersonate menjadi true. Misalnya:
<identitas peniru = "benar" />
Meniru identitas pengguna tertentu untuk semua permintaan ke aplikasi ASP.NET
Untuk meniru identitas pengguna tertentu untuk semua permintaan di semua halaman aplikasi ASP.NET, Anda dapat menentukan atribut nama pengguna dan kata sandi. Misalnya:
<identity impersonate="true" userName="accountname" password="password" />
Catatan: Identitas proses yang meniru identitas pengguna tertentu di thread harus memiliki izin "Sebagai bagian dari sistem operasi". Secara default, proses Aspnet_wp.exe berjalan di bawah akun komputer bernama ASPNET. Namun, akun ini tidak memiliki izin yang diperlukan untuk meniru identitas pengguna tertentu. Jika Anda mencoba meniru identitas pengguna tertentu, pesan kesalahan akan muncul.
Untuk mengatasi masalah ini, gunakan salah satu metode berikut:
•
Berikan izin "Bertindak sebagai bagian dari sistem operasi" pada akun ASPNET (akun dengan hak paling rendah).
Catatan: Meskipun metode ini dapat menyelesaikan masalah, Microsoft tidak merekomendasikan metode ini.
•
Di bagian konfigurasi <processModel> pada file Machine.config, ubah akun tempat proses Aspnet_wp.exe dijalankan ke akun Sistem.
Meniru identitas pengguna yang diautentikasi dalam kode
Untuk meniru identitas pengguna yang diautentikasi (User.Identity) hanya saat menjalankan bagian kode tertentu, Anda dapat menggunakan kode berikut. Metode ini mengharuskan ID pengguna autentikasi bertipe WindowsIdentity.
Visual Basic .NET
Redupkan ImpersonationContext Sebagai System.Security.Principal.WindowsImpersonationContext
Redupkan WindowsIdentity saat ini Sebagai System.Security.Principal.WindowsIdentity
currentWindowsIdentity = CType(User.Identity, System.Security.Principal.WindowsIdentity)
peniruanContext = currentWindowsIdentity.Impersonate()
'Masukkan kode Anda yang berjalan di bawah konteks keamanan pengguna yang mengautentikasi di sini.
peniruanContext.Undo()
Visual C# .NET
System.Security.Principal.WindowsImpersonationContext peniruanContext;
peniruan identitas =
((Sistem.Keamanan.Kepala Sekolah.WindowsIdentity)Pengguna.Identitas).Impersonate();
//Masukkan kode Anda yang berjalan dalam konteks keamanan pengguna yang mengautentikasi di sini.
peniruanContext.Undo();
Visual J# .NET
System.Security.Principal.WindowsImpersonationContext peniruanContext;
peniruan identitas =
((Sistem.Keamanan.Kepala Sekolah.WindowsIdentity)get_User().get_Identity()).Impersonate();
//Masukkan kode Anda yang berjalan dalam konteks keamanan pengguna yang mengautentikasi di sini.
peniruanContext.Undo();
Meniru Identitas Pengguna Tertentu dalam Kode
Untuk meniru identitas pengguna tertentu hanya ketika menjalankan bagian tertentu dari kode Anda, gunakan kode berikut:
Visual Basic .NET
<%@ Page Language="VB" %>
<%@ Impor Namespace = "Sistem.Web" %>
<%@ Impor Namespace = "Sistem.Web.Keamanan" %>
<%@ Impor Namespace = "Sistem.Keamanan.Kepala Sekolah" %>
<%@ Impor Namespace = "System.Runtime.InteropServices" %>
<skrip runat=server>
Redupkan LOGON32_LOGON_INTERACTIVE Sebagai Integer = 2
Redupkan LOGON32_PROVIDER_DEFAULT Sebagai Integer = 0
Redupkan impersonationContext Sebagai WindowsImpersonationContext
Deklarasikan Fungsi LogonUserA Lib "advapi32.dll" (ByVal lpszUsername As String, _
ByVal lpszDomain Sebagai String, _
ByVal lpszPassword Sebagai String, _
ByVal dwLogonType Sebagai Integer, _
ByVal dwLogonProvider Sebagai Integer, _
ByRef phToken Sebagai IntPtr) Sebagai Integer
Deklarasikan Fungsi Otomatis DuplikatToken Lib "advapi32.dll" ( _
ByVal ExistingTokenHandle Sebagai IntPtr, _
Tingkat Peniruan Identitas ByVal Sebagai Integer, _
ByRef DuplikatTokenHandle Sebagai IntPtr) Sebagai Integer
Deklarasikan Fungsi Otomatis RevertToSelf Lib "advapi32.dll" () Selama
Deklarasikan Fungsi Otomatis CloseHandle Lib "kernel32.dll" (ByVal handle As IntPtr) Selama
Sub Page_Load Publik(ByVal s Sebagai Objek, ByVal dan Sebagai EventArgs)
Jika impersonateValidUser("nama pengguna", "domain", "kata sandi") Lalu
'Masukkan kode Anda yang berjalan dalam konteks keamanan pengguna tertentu di sini.
batalkan Peniruan Identitas()
Kalau tidak
'Peniruan identitas Anda gagal. Oleh karena itu, sertakan mekanisme anti-gagal di sini.
Akhiri Jika
Akhiri Sub
Fungsi Pribadi impersonateValidUser(ByVal userName As String, _
Domain ByVal Sebagai String, kata sandi ByVal Sebagai String) Sebagai Boolean
Redupkan tempWindowsIdentity Sebagai WindowsIdentity
Redupkan token Sebagai IntPtr = IntPtr.Zero
Redupkan tokenDuplikat Sebagai IntPtr = IntPtr.Zero
meniruValidUser = Salah
Jika KembalikanToSelf() Lalu
Jika LogonUserA(Nama pengguna, domain, kata sandi, LOGON32_LOGON_INTERACTIVE,
LOGON32_PROVIDER_DEFAULT, token) <> 0 Lalu
Jika DuplikatToken(token, 2, tokenDuplikat) <> 0 Lalu
tempWindowsIdentity = WindowsIdentity baru (tokenDuplikat)
peniruanContext = tempWindowsIdentity.Impersonate()
Jika Bukan Peniruan Identitas, Tidak Ada Apa-apanya
meniruValidUser = Benar
Akhiri Jika
Akhiri Jika
Akhiri Jika
Akhiri Jika
Jika Bukan tokenDuplikat.Sama dengan(IntPtr.Zero) Lalu
CloseHandle(tokenDuplikat)
Akhiri Jika
Jika Bukan token.Equals(IntPtr.Zero) Lalu
CloseHandle (token)
Akhiri Jika
Fungsi Akhir
Sub Pribadi membatalkan Peniruan Identitas ()
peniruanContext.Undo()
Akhiri Sub
</skrip>
Visual C# .NET
<%@ Halaman Language="C#"%>
<%@ Impor Namespace = "Sistem.Web" %>
<%@ Impor Namespace = "Sistem.Web.Keamanan" %>
<%@ Impor Namespace = "Sistem.Keamanan.Kepala Sekolah" %>
<%@ Impor Namespace = "System.Runtime.InteropServices" %>
<skrip runat=server>
konstanta publik int LOGON32_LOGON_INTERACTIVE = 2;
konstanta publik int LOGON32_PROVIDER_DEFAULT = 0;
WindowsImpersonationContext peniruan identitas;
[Impor Dll("advapi32.dll")]
publik statis eksternal int LogonUserA(String lpszUserName,
Tali lpszDomain,
String lpszKata Sandi,
ke dalam dwLogonType,
int dwLogonProvider,
referensi IntPtr phToken);
[DllImport("advapi32.dll", CharSet=CharSet.Auto, SetLastError=true)]
publik statis eksternal int DuplikatToken(IntPtr hToken,
int tingkat peniruan identitas,
referensi IntPtr hNewToken);
[DllImport("advapi32.dll", CharSet=CharSet.Auto, SetLastError=true)]
bool eksternal statis publik RevertToSelf();
[DllImport("kernel32.dll", CharSet=CharSet.Auto)]
bool eksternal statis publik CloseHandle(pegangan IntPtr);
public void Page_Load(Objek s, EventArgs e)
{
if(impersonateValidUser("nama pengguna", "domain", "kata sandi"))
{
//Masukkan kode Anda yang berjalan dalam konteks keamanan pengguna tertentu di sini.
batalkan Peniruan Identitas();
}
kalau tidak
{
//Peniruan identitas Anda gagal. Oleh karena itu, sertakan mekanisme anti-gagal di sini.
}
}
private bool impersonateValidUser (String nama pengguna, domain String, kata sandi String)
{
WindowsIdentity tempWindowsIdentity;
Token IntPtr = IntPtr.Zero;
IntPtr tokenDuplikat = IntPtr.Zero;
jika(KembaliKeSelf())
{
if(LogonUserA(Nama pengguna, domain, kata sandi, LOGON32_LOGON_INTERACTIVE,
LOGON32_PROVIDER_DEFAULT, token referensi) != 0)
{
if(DuplikatToken(token, 2, ref tokenDuplikat) != 0)
{
tempWindowsIdentity = WindowsIdentity baru (tokenDuplikat);
impersonationContext = tempWindowsIdentity.Impersonate();
jika (impersonationContext != null)
{
CloseHandle(token);
CloseHandle(tokenDuplikat);
kembali benar;
}
}
}
}
if(token!= IntPtr.Zero)
CloseHandle(token);
if(tokenDuplikat!=IntPtr.Zero)
CloseHandle(tokenDuplikat);
kembali salah;
}
kekosongan pribadi undoImpersonation()
{
peniruanContext.Undo();
}
</skrip>
Visual J# .NET
<%@ Halaman bahasa="VJ#" %>
<%@ Impor Namespace="Sistem.Web" %>
<%@ Impor Namespace="Sistem.Web.Keamanan" %>
<%@ Impor Namespace="Sistem.Keamanan.Kepala Sekolah" %>
<%@ Impor Namespace="System.Runtime.InteropServices" %>
<skrip runat=server>
int statis publik LOGON32_LOGON_INTERACTIVE = 2;
int statis publik LOGON32_PROVIDER_DEFAULT = 0;
WindowsImpersonationContext peniruan identitas;
/** @attribute DllImport("advapi32.dll") */
int asli publik statis LogonUserA(String lpszUserName,
Tali lpszDomain,
String lpszKata Sandi,
ke dalam dwLogonType,
int dwLogonProvider,
Sistem.IntPtr[] phToken);
/** @attribute DllImport("advapi32.dll",
CharSet=CharSet.Otomatis, SetLastError=benar) */
int DuplikatToken asli statis publik(System.IntPtr hToken,
int tingkat peniruan identitas,
Sistem.IntPtr[] hNewToken);
/** @attribute DllImport("kernel32.dll",CharSet=CharSet.Auto) */
boolean asli publik statis CloseHandle(System.IntPtr[] handle);
/** @attribute DllImport("advapi32.dll",
CharSet=CharSet.Otomatis,SetLastError=benar) */
boolean asli statis publik RevertToSelf();
public void Page_Load(Objek s, System.EventArgs e)
{
if(impersonateValidUser("nama pengguna", "domain", "kata sandi"))
{
//Masukkan kode Anda yang berjalan dalam konteks keamanan pengguna tertentu di sini.
batalkan Peniruan Identitas();
}
kalau tidak
{
//Peniruan identitas Anda gagal. Oleh karena itu, sertakan mekanisme anti-gagal di sini.
}
}
boolean pribadi impersonateValidUser (String nama pengguna, domain String, kata sandi String)
{
WindowsIdentity tempWindowsIdentity;
Token Sistem.IntPtr[] = Sistem.IntPtr[1] baru;
Sistem.IntPtr[] tokenDuplikat = Sistem baru.IntPtr[1];
jika(KembaliKeSelf())
{
if(LogonUserA(Nama pengguna, domain, kata sandi, LOGON32_LOGON_INTERACTIVE,
LOGON32_PROVIDER_DEFAULT, tanda) != 0)
{
jika(DuplikatToken(token[0], 2, tokenDuplikat) != 0)
{
tempWindowsIdentity = WindowsIdentity baru(tokenDuplikat[0]);
impersonationContext = tempWindowsIdentity.Impersonate();
jika (impersonationContext != null)
{
CloseHandle(tokenDuplikat);
CloseHandle(token);
kembali benar;
}
}
}
}
if(!token[0].Equals(System.IntPtr.Zero))
CloseHandle(token);
if(!tokenDuplikat[0].Sama(Sistem.IntPtr.Zero))
CloseHandle(tokenDuplikat);
kembali salah;
}
kekosongan pribadi undoImpersonation()
{
peniruanContext.Undo();
}
</skrip>
Catatan: Identitas proses yang meniru identitas pengguna tertentu di thread harus memiliki izin "Sebagai bagian dari sistem operasi". Secara default, proses Aspnet_wp.exe berjalan di bawah akun komputer bernama ASPNET. Namun, akun ini tidak memiliki izin yang diperlukan untuk meniru identitas pengguna tertentu. Jika Anda mencoba meniru identitas pengguna tertentu, pesan kesalahan akan muncul.
Untuk mengatasi masalah ini, gunakan salah satu metode berikut:
•
Berikan izin "Bertindak sebagai bagian dari sistem operasi" pada akun ASPNET.
•
Di bagian konfigurasi <processModel> pada file Machine.config, ubah akun tempat proses Aspnet_wp.exe dijalankan ke akun Sistem.