24

Ben Form kimlik doğrulaması kullanmalıdır olup Windows kimlik bir ActiveDirectoryMembershipProvider erişmek için bir ASP.NET sitesi var. Site, Windows kimlik doğrulamasının kullandığı tarayıcı kimlik doğrulama penceresinin yerine tasarlanmış bir giriş formuna ihtiyaç duydukları için form kullanmalıdır.Impersonate kullanarak form kimlik

site kullanıcı kullanıcının belirli dosyalara erişmek için Active Directory üzerinden oturum taklit gerekiyor. Ben kendi özel izinleri almak için AD kullanıcı olarak taklit gerekir çünkü WindowsIdentity.Impersonate()LoginUser() kullanabilir ve olamaz

<authentication mode="Forms"> 
    <forms loginUrl="login.aspx" timeout="480"/> 
</authentication> 
<identity impersonate="true" /> 

: benim web.config içerir, ancak bununla

, WindowsIdentity.GetCurrent() HttpContext.Current.User.Identity aynı değildir formlar giriş yapma ilgilenir çünkü, ben kullanıcının şifresini bilmiyorum.

Login.aspx.cs belki mümkün mü, System.Web.UI.WebControls.Login.Password almaya, sonraiçin bir oturum değişkeninde LoginUser() belirteci kurtarmakdaha sonra? Ya da belki doğru yolu taklit etmenin daha güvenli bir yöntemi? Aklım karıştı

neden kimlik doğrulama otomatik <identity impersonate="true" />

Bu http://msdn.microsoft.com/en-us/library/ms998351.aspx okudum olamaz ama Windows kimlik doğrulaması kullanır Forms.

+0

İşte kullandığım geçici çözüm: Ben o zaman) (DirectorySecurity.GetAccessRules aracılığıyla her dosya veya klasörün izinlerini almak denetlemek, dosyalara ıuser_ erişim verdi. Erişim kurallarında 'FileSystemAccessRule.Value ==" DOMAIN \\ "+ Page.User.Identity.Name" ise, o dosyayı veya klasörü bir listeye ekliyorum. Son olarak dosya listesini görüntülüyorum. Dolayısıyla, kimliğe bürünme yerine, IUSR_ tam erişimini veriyorum ve erişim için kullanıcının erişmesi gereken şeylere el ile izinleri kontrol ediyorum. – Robert

cevap

19

kadar olacaktır. Aşağıdaki kod , çalışır.

Robert tarafından belirtilen Visual Studio Magazine article mükemmel bir kaynaktır. Makalede örnek kodla ilgili bazı sorunlar var, bu yüzden aşağıda bazı çalışma kodlarını ekledim.

Not: Visual Studio'yu kullanıyorsanız, UAC engelleme kimliğine bürünme ile ilgili sorunları önlemek için "Yönetici olarak Çalıştırın" u başlattığınızdan emin olun.

// in your login page (hook up to OnAuthenticate event) 
protected void LoginControl_Authenticate(object sender, AuthenticateEventArgs e) 
{ 
    int token; 
    // replace "YOURDOMAIN" with your actual domain name 
    e.Authenticated = LogonUser(LoginUser.UserName,"YOURDOMAIN",LoginUser.Password,8,0,out token); 
    if (e.Authenticated) { 
     Session.Add("principal", new WindowsPrincipal(new WindowsIdentity(new IntPtr(token)))); 
    } 
} 

[DllImport("advapi32.dll", SetLastError = true)] 
public static extern bool LogonUser(string lpszUsername, string lpszDomain, string lpszPassword, 
    int dwLogonType, int dwLogonProvider, out int TokenHandle); 


// in global.asax.cs 
void Application_PreRequestHandlerExecute(object send, EventArgs e) 
{ 
    if (Thread.CurrentPrincipal.Identity.IsAuthenticated == true && HttpContext.Current.Session != null) { 
     WindowsPrincipal windowsPrincipal = (WindowsPrincipal)Session["principal"]; 
     Session["principal"] = (GenericPrincipal)Thread.CurrentPrincipal; 
     Thread.CurrentPrincipal = windowsPrincipal; 
     HttpContext.Current.User = windowsPrincipal; 
     HttpContext.Current.Items["identity"] = ((WindowsIdentity)windowsPrincipal.Identity).Impersonate(); 
    } 
} 

// in global.asax.cs 
void Application_PostRequestHandlerExecute(object send, EventArgs e) 
{ 
    if (HttpContext.Current.Session != null && Session["principal"] as GenericPrincipal != null) { 
     GenericPrincipal genericPrincipal = (GenericPrincipal)Session["principal"]; 
     Session["principal"] = (WindowsPrincipal)Thread.CurrentPrincipal; 
     Thread.CurrentPrincipal = genericPrincipal; 
     HttpContext.Current.User = genericPrincipal; 
     ((WindowsImpersonationContext)HttpContext.Current.Items["identity"]).Undo(); 
    } 
} 

// test that impersonation is working (add this and an Asp:Label to a test page) 
protected void Page_Load(object sender, EventArgs e) 
{ 
    try { 
     // replace YOURSERVER and YOURDB with your actual server and database names 
     string connstring = "data source=YOURSERVER;initial catalog=YOURDB;integrated security=True"; 
     using (SqlConnection conn = new SqlConnection(connstring)) { 
      conn.Open(); 
      SqlCommand cmd = new SqlCommand("SELECT SUSER_NAME()", conn); 
      using (SqlDataReader rdr = cmd.ExecuteReader()) { 
       rdr.Read(); 
       Label1.Text = "SUSER_NAME() = " + rdr.GetString(0); 
      } 
     } 
    } 
    catch { 
    } 
} 

Güncelleme:

Ayrıca Response.End() gibi aramalar Application_PostRequestHandlerExecute atlayacaktır çünkü Application_EndRequest işlemek gerekir.

Başka bir sorun, WindowsIdentity'nin toplanan çöpleri alabilmesidir, bu nedenle her istekte oturum açma simgesinden yeni bir WindowsIdentity ve WindowsPrincipal oluşturmalısınız.

Update2: Bu downvoted oluyor neden çalıştığı için

Ben emin değilim. Pinvoke imzasını ve bazı test kodlarını ekledim. Tekrar, "Yönetici olarak çalıştır" kullanarak Visual Studio'yu başlatın. Google nasıl yapacağınızı bilmiyorsanız bunu nasıl yapacağınızı.

+0

FWIW, (Ben OP sorunum) Bu cevabı destekledim ve doğru cevabı değiştirdim. – Robert

+0

Bu yaklaşım, benim testlerimde MVC için çalışmadı, ancak bunu System.Web.Mvc.Controller'den BeginExecute ve EndExecute geçersiz kılmayı başardım. Bu yaklaşımın problemi, bunu BaseController'a koymam gerektiğidir ve mevcut kontrolörün tamamını bu BaseController – Luty

+0

'dan MVC kullanıyorum. Oturumunu ["principal"] = (GenericPrincipal) Thread.CurrentPrincipal; satırı, bir web.PrincipalRole'ı bir GenericPrincipal'e dönüştüremediğinden. Gerçekten de önemli değildi çünkü veritabanına bağlanırken sadece bir kullanıcının kimliğine bürünmem gerekiyordu, böylece site genelinde kullanıcı kimliğine bürünmüş bir siteyi kullanmam gerekmiyordu. Bu da global.asax.cs'e hiçbir şey koymadığım anlamına geliyor. Bunu db sınıfına ekledim. – Kevin

0

kullanıcıların IE kullanıyorsanız, o zaman web sitesi için entegre güvenlik açabilirsiniz ve kullanıcıların sessizce (no login iletişim, hiçbir giriş sayfası) doğrulanmış olacaktır. Kimliğine bürünme sonra çalışır. Diğer tarayıcıları hedeflemeniz gerekiyorsa, bu çalışmayabilir (kullanıcı muhtemelen bir oturum açma iletişim kutusuyla birlikte sunulur). Kullanıcıların kendi etki alanı hesabı dışında bir hesap kullanarak giriş yapmadan çünkü

Geçerli bürünme işe asla. Sitenin kimlik bilgilerini sağlamayan bir kullanıcının kimliğine bürünmesini bekleyemezsiniz. Bu, temel güvenlik prensiplerine karşı giderdi.

+2

Bu bir extranettir, bu sayede kullanıcılar, LAN dışındaki LAN hesaplarını kullanarak dahili dosyalara erişir. Bir ActiveDirectoryMembershipProvider kullanırken, kullanıcılar etki alanı hesabını kullanarak giriş yapıyor. Gerçek kullanıcı deposu AD'dir, Formlar veya Windows kimlik doğrulaması başarıyla kullanılarak oturum açabilir, ancak Formlar kullanılırken dosyalara erişemez, yalnızca Forms IUSR_ * hesabını kullandığı için Windows kullanırken kullanılır. – Robert

0

Son zamanlarda aynı sorunla karşılaştık, müşteri kullanıcılarının AD hesabıyla giriş yapmasını istediler ve daha sonra bu kimlik bilgileri Analiz Hizmetine ve diğer tüm veritabanlarına erişmek için kullanılmalıdır. . Bu şekilde istediler çünkü bir denetleme sistemi uyguluyorlardı ve tüm girişler cari hesaplar tarafından yapılmalıdır.

Biz o amele ama aynı zamanda düz metin olarak kullanıcının parolasını bize soruyor, bir kısmını taklit için Formlar kimlik doğrulama ve Win32 LogonUser() API çalıştı. Daha sonra, Windows kimlik doğrulamasını kullanmaya karar verdik, bu bize çok zaman kazandırıyor (artık AD kimlik doğrulaması yok, elle taklit). Tabii ki, hiçbir fantezi giriş sayfası yoktu.Visual Studio

-6

Nuget paket konsol vadede kurun-Paket 51Degrees.mobi

Daha sonra web 51Degrees katacak içinde Sonra çözüm

açın yükleyin. Daha sonra yönlendirme bölümünü kaldırmak için Uygulama Verilerinizde 51Degrees.mobi.config dosyasını düzenleyebilirsiniz.

Artık Kimlik yapılabilir Formlar kullanılarak bir kullanıcının kimliğine bürünmek tarih tarayıcı yetenekleri

-1
durumda sadece için

ve biraz geç, ben benim için çalışıyor ve gerçekten basit ama tabii sadece test amaçlıdır şey buldum ...

Sadece kullanıcı adıyla çerez ayarlayın.

//Login button. You can give whatever input to the form 
protected void Login_Click(object sender, EventArgs e) 
{ 
    FormsAuthentication.SetAuthCookie("your_username", createPersistentCookie: true); 
    Response.Redirect("~/"); 
} 

kabul herhangi bir yorum ...

+0

Bu soru, WindowsIdentity.Impersonate() 'ın çalışmasını sağlamakla ilgilidir. Bu cevabın bu soruyu nasıl cevaplamaya çalıştığını göremiyorum – KyleMit

İlgili konular