Avatar billede josto Nybegynder
26. juli 2005 - 11:50 Der er 2 kommentarer og
1 løsning

Problem med LDAP i webapp

Jeg tester en webapp. men kan ikke få validering af brugernavne og passwords mod en Windows 2003 server.

Opstillingen er følgende:
W 2003 med AD og et domæne (OST)
W 2003 med IIS og webapp'en.

Webserveren er medlem af OST.

Jeg har benyttet store dele af koden fra:
http://support.microsoft.com/default.aspx?scid=kb;EN-US;Q316748

Min kode er følgende:
---------------------
public bool IsAuthenticated(String username, String pwd)
{
  String domainAndUsername = XMLSettings.Instance.GetValueAsString("server:domain") + @"\\" + username;

    try
    {   
        DirectoryEntry entry = new DirectoryEntry(_path, domainAndUsername, pwd);
    Log.CreateLog(Log.Type.Information, "LDAP::IsAuthenticated", "Der blev udført DirectoryEntry(" + _path + ", " + domainAndUsername + ", " + pwd + ");");
    //Bind to the native AdsObject to force authentication.
    Object obj = entry.NativeObject;

    DirectorySearcher search = new DirectorySearcher(entry);
               
    search.Filter = "(SAMAccountName=" + username + ")";
    search.PropertiesToLoad.Add("cn");
    SearchResult result = search.FindOne();
       
    if(null == result)
    {
        return false;
    }
       
    //Update the new path to the user in the directory.
    _path = result.Path;
    _filterAttribute = (String)result.Properties["cn"][0];
    }
    catch (Exception ex)
    {
        Log.CreateLog(Log.Type.Error, "LDAP::IsAuthenticated", "Der opstod en exception: " + ex);
        return false;
    }
    return true;
}
---------------------

Når jeg afvikler koden får jeg en exception:
----------
System.Runtime.InteropServices.COMException (0x80004005): Unspecified error
  at System.DirectoryServices.DirectoryEntry.Bind(Boolean throwIfFail)
  at System.DirectoryServices.DirectoryEntry.Bind()
  at System.DirectoryServices.DirectoryEntry.get_NativeObject()
  at intranet.classes.logon.LdapAuthentication.IsAuthenticated(String username, String pwd) in c:inetpubwwwrootintranetclasseslogonLdap.cs:line 49
----------
Line 49 -> Object obj = entry.NativeObject;
Den log som bliver lavet lige før den fejlramte kode viser at servernavn, brugernavn og passwords er korrekte.

Hvad er der galt? Har brugte ganske mange dage på det nu.
Avatar billede josto Nybegynder
10. august 2005 - 11:45 #1
Ingen svar - så jeg lukker.

Har dog opdaget et spm. http://www.eksperten.dk/spm/638634
Avatar billede josto Nybegynder
20. august 2005 - 22:32 #2
Problemet løst - jubii...

For at andre ikke skal lede i i flere uger som mig er her en "løsning":

http://www.codeproject.com/csharp/arbauthentication.asp findes koden:
------------------------------------------------------
public void Login()
    {     
      // now create the directory entry to establish connection
      using(DirectoryEntry deDirEntry = new DirectoryEntry(this.strDomain,
                                                          this.strUser,
                                                          this.strPass,
                                                          this.atAuthentType))

      {
        // if user is verified then it will welcome them
        try
        {               
          MessageBox.Show("Welcome to '" + deDirEntry.Name + "'");
         
          // TODO: add your specific tasks here
        }
        catch (Exception exp)
        {
          MessageBox.Show("Sorry, unable to verify your information");
        }
      }
    }
------------------------------------------------------
Koden skulle gerne være følgende:

DirectoryEntry("LDAP://MYDOMAIN", "cn=username", "password", AuthenticationTypes.Secure)

Hvis dette ikke virker kunne følgende tråd være en hjælp:
http://www.dotnet247.com/247reference/msgs/36/182022.aspx - se sidste indlæg

I tilfælde af at det forsvinder er en lille del af svaret her:
-------------------------------------
Solutions:

The solution is to run your ASP.NET application under an account that can
access AD. There are a couple of ways to do this:

1) You can actually do all your work WITHOUT sending a username and password
to the DirectoryEntry bind if you're running under the system account. This
isn't an anonymous bind, it's a privileged one, because you can actually
search the whole AD tree (an anonymous bind to AD gives you almost nothing
to look at)

e.g. DirectoryEntry entry = new DirectoryEntry("LDAP://DOMAIN");

This isn't an option for me, as I need to bind with the username and
password as a form of authentication.

2) Ensure ASP.NET runs under the MACHINENAME\ASPNET account by setting the
userName attribute in the processModel section of machine.config to
"machine" (make sure the password attribute is set to "AutoGenerate"). This
will enforce the change on all ASP.NET apps. This is recommended as using
"system" is insecure and essentially "deprecated".

3) Run your specific web application under a specified username and
password, such as a domain login. Do this by adding the following line to
web.config:

<identity impersonate="true" userName="DOMAIN\myusername"
password="mypassword"/>
</system.web>
</configuration>

Troubleshooting:

1) First you should test that you can actually get to the Active Directory
using the LDAP method by using a standard LDAP client such as LDAPBrowser
2) You should make sure the username / password you're using can actually
bind to the AD using the LDAP Browser
3) Use the line of code a bit further up to troubleshoot what account your
app is running under (i.e. to see whether your impersonation or
machine.config changes have taken effect)

I hope this helps you! Was a frustrating error that had no documentation or
solutions I could find.
Avatar billede jonasnielsen Nybegynder
10. juni 2009 - 13:40 #3
Tak
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester