On Tue, Sep 16, 2008 at 4:05 PM, André Warnier <[EMAIL PROTECTED]> wrote:
> Clayton Hicklin wrote: > >> On Tue, Sep 16, 2008 at 3:35 PM, André Warnier <[EMAIL PROTECTED]> wrote: >> >> Clayton Hicklin wrote: >>> >>> On Tue, Sep 16, 2008 at 3:11 PM, André Warnier <[EMAIL PROTECTED]> wrote: >>>> >>>> Clayton Hicklin wrote: >>>> >>>>> On Tue, Sep 16, 2008 at 2:40 PM, Clayton Hicklin <[EMAIL PROTECTED]> >>>>> >>>>>> wrote: >>>>>> >>>>>> "So what I believe in this case, is that the LDAP module might, >>>>>> possibly, >>>>>> >>>>>> rely on the "REMOTE_USER" header that IE is sometimes sending when >>>>>>> the >>>>>>> user >>>>>>> is authenticated in the domain. And that one indeed would probably >>>>>>> contain >>>>>>> the domain and user. If that is the case, then a simple manipulation >>>>>>> of >>>>>>> the >>>>>>> HTTP headers of the request, using standard Apache modules, might be >>>>>>> enough >>>>>>> to get just the user." >>>>>>> >>>>>>> I agree, I believe that is exactly what is happening. I can verify >>>>>>> that >>>>>>> the REMOTE_USER server variable is set to 'domain\user' using PHP >>>>>>> (echo >>>>>>> $_SERVER['REMOTE_USER']). I didn't realize that you could manipulate >>>>>>> headers with Apache. I will definitely look into this as it sounds >>>>>>> like >>>>>>> that is what I need. Thanks. >>>>>>> >>>>>>> Clayton >>>>>>> >>>>>>> >>>>>>> On Tue, Sep 16, 2008 at 2:32 PM, André Warnier <[EMAIL PROTECTED]> >>>>>>> wrote: >>>>>>> >>>>>>> Clayton Hicklin wrote: >>>>>>> >>>>>>> On Tue, Sep 16, 2008 at 1:28 PM, André Warnier <[EMAIL PROTECTED]> >>>>>>>> wrote: >>>>>>>> >>>>>>>> Clayton Hicklin wrote: >>>>>>>>> [...] >>>>>>>>> >>>>>>>>> Clayton, >>>>>>>>> >>>>>>>> Your first communication was a bit summarised, so I did not know to >>>>>>>> which >>>>>>>> extent you knew the underlying tidbits, from there my fist answer. >>>>>>>> >>>>>>>> I am currently in the middle of the same kind of problematic. I have >>>>>>>> created an SSO solution that works at the Tomcat level, in a >>>>>>>> particular >>>>>>>> context, and and I am interested in a solution at the Apache level, >>>>>>>> just >>>>>>>> like you. >>>>>>>> In the process of creating the Tomcat-level solution, I have learned >>>>>>>> quite >>>>>>>> a bit about how IE (and servers) work in that respect, and my >>>>>>>> questions/opinions are guided by that. >>>>>>>> >>>>>>>> >>>>>>>> I didn't mean to imply that the authentication fails "in" IE. I >>>>>>>> >>>>>>>> realize it >>>>>>>>> is at the server. My issue is that I would like a seamless user >>>>>>>>> experience. IE is passing 'domain\user' due to "Windows Integrated >>>>>>>>> Authentication" being turned on and it would be nice if those >>>>>>>>> credentials >>>>>>>>> could be used to authenticate without popping up the login dialog. >>>>>>>>> >>>>>>>>> That is what should indeed happen, if the server supports the >>>>>>>>> related >>>>>>>>> >>>>>>>>> authentication, meaning the authentication "type" that IE is >>>>>>>> trying. >>>>>>>> >>>>>>>> This >>>>>>>> >>>>>>>> works using the mod_auth_sspi module (which uses NTLM) but not with >>>>>>>> >>>>>>>> LDAP >>>>>>>>> authentication. >>>>>>>>> >>>>>>>>> Which module are you using for this LDAP authentication ? >>>>>>>>> >>>>>>>>> The reason is that with LDAP authentication, you have to >>>>>>>> >>>>>>>> specify an attribute to search for the username that is passed to >>>>>>>> >>>>>>>> Apache. >>>>>>>>> In the case of Active Directory, this attribute is sAMAccountName. >>>>>>>>> This >>>>>>>>> attribute stores the username of the Windows user. The problem is >>>>>>>>> that >>>>>>>>> IE >>>>>>>>> passes 'domain\user' (not just 'user') on it's first attempt at >>>>>>>>> authentication. >>>>>>>>> >>>>>>>>> That's where I am not so sure. What makes you sure that this is >>>>>>>>> >>>>>>>>> indeed >>>>>>>> what is happening ? (I am not saying it is false, I just mean that I >>>>>>>> have a >>>>>>>> doubt and would be interested in whether you have really verified >>>>>>>> this, >>>>>>>> and >>>>>>>> how). >>>>>>>> >>>>>>>> This obviously fails which causes the login dialog to pop >>>>>>>> >>>>>>>> up. You can then just type in your username and password and >>>>>>>> >>>>>>>> everything >>>>>>>>> works fine. >>>>>>>>> >>>>>>>>> I think the ultimate solution would be to modify the Apache LDAP >>>>>>>>> module >>>>>>>>> to >>>>>>>>> accept a parameter that would optionally strip out the domain >>>>>>>>> portion >>>>>>>>> of >>>>>>>>> the >>>>>>>>> credentials that IE passes. >>>>>>>>> >>>>>>>>> Yes, that kind of what you need, unless that parameter already >>>>>>>>> exists >>>>>>>>> >>>>>>>>> in >>>>>>>> the module you are using. It would be relatively surprising if it >>>>>>>> didn't. >>>>>>>> But even if it isn't available, there might be another solution, >>>>>>>> stay >>>>>>>> with >>>>>>>> me. >>>>>>>> >>>>>>>> That way, we could use IE + APACHE + Active >>>>>>>> >>>>>>>> Directory (LDAP) for a seamless SSO solution. I think this would >>>>>>>> be >>>>>>>> >>>>>>>> pretty >>>>>>>>> common in most corporate environments, which is where this is being >>>>>>>>> implemented. >>>>>>>>> >>>>>>>>> >>>>>>>>> One nore thing I want to add here, is a brief summary of how web >>>>>>>>> >>>>>>>>> authentication works, just in case there is a part in there that >>>>>>>> isn't >>>>>>>> clear >>>>>>>> to you, and because there is a particular step that may play a role. >>>>>>>> >>>>>>>> 0) we imagine that, at the beginning, the browser is just opened, >>>>>>>> and >>>>>>>> knows nothing yet of the URL or the server on which it resides. >>>>>>>> >>>>>>>> 1) browser sends a request to server for a particular URL. Because >>>>>>>> the >>>>>>>> browser at this stage does not know that this URL requires any >>>>>>>> authentication, the request is sent without any authentication. >>>>>>>> 2) the server receives this request. It consults its configuration, >>>>>>>> and >>>>>>>> sees that this URL requires some form of authentication and/or >>>>>>>> access >>>>>>>> control. It thus verifies if the request contains this kind of >>>>>>>> authentication. If yes, the request goes through and we're done. >>>>>>>> 3) The request does not contain an authentication (or not one of the >>>>>>>> accepted type). So the server sends back to the browser a response >>>>>>>> "401 >>>>>>>> Authorization required", along with the type of authentication >>>>>>>> required >>>>>>>> (NTLM, Basic, Digest are 3 possible, supported by IE), and along (if >>>>>>>> Basic >>>>>>>> or Digest) with a "realm" (the protected "area" name on the server). >>>>>>>> 4) the browser receives the 401 response. It looks at the >>>>>>>> "authentication >>>>>>>> type" required, and, *if it can handle that* (which may depend on >>>>>>>> its >>>>>>>> settings, security zone etc..) it proceeds to try that kind of >>>>>>>> authentication. (If the browser cannot handle that particular type >>>>>>>> of >>>>>>>> authentication requested by the server, it may check if it has a >>>>>>>> "fallback >>>>>>>> type" that it can try. If it doesn't have such a fall-back, I do not >>>>>>>> know >>>>>>>> really what happens, but I guess some kind of error at the browser >>>>>>>> side.) >>>>>>>> 5) once the browser has "put in the bag" the required pieces for the >>>>>>>> authentication (as requested by the server, or its fallback type), >>>>>>>> it >>>>>>>> re-sends the same original request to the server, but this time it >>>>>>>> adds >>>>>>>> an >>>>>>>> "Authorization:" header with the appropriate content. >>>>>>>> >>>>>>>> Now, depending on the case, a back-and-forth dialog *may* take place >>>>>>>> between the server and the browser. For instance, with IE and NTLM >>>>>>>> authentication, there are 3 such exchanges before the server and >>>>>>>> browser >>>>>>>> are >>>>>>>> satisfied, and the browser has the right content to send in its >>>>>>>> "Authorization:" header. >>>>>>>> >>>>>>>> >>>>>>>> I am only pointing this all out so that it would be clearer that it >>>>>>>> is >>>>>>>> important to know, for instance, *which* kind of authentication the >>>>>>>> LDAP >>>>>>>> module is telling IE (in the 401 message) that is required. >>>>>>>> Unless this LDAP module can handle an NTLM-type 3-step dialog with >>>>>>>> IE >>>>>>>> (like the mod_auth_sspi module can), then probably what the module >>>>>>>> sends >>>>>>>> is >>>>>>>> a response which requires a "Basic" authentication. >>>>>>>> Does IE then automatically send whatever IE thinks the domain\userid >>>>>>>> is >>>>>>>> , >>>>>>>> as a "Authorization: Basic xxxxxxxxxxxxxxxxxx" header containing the >>>>>>>> user-id >>>>>>>> and user password ? >>>>>>>> It seems a bit far-fetched that IE would send the user's password >>>>>>>> over >>>>>>>> the >>>>>>>> network, just Base64-encoded. >>>>>>>> >>>>>>>> So what I believe in this case, is that the LDAP module might, >>>>>>>> possibly, >>>>>>>> rely on the "REMOTE_USER" header that IE is sometimes sending when >>>>>>>> the >>>>>>>> user >>>>>>>> is authenticated in the domain. And that one indeed would probably >>>>>>>> contain >>>>>>>> the domain and user. If that is the case, then a simple >>>>>>>> manipulation >>>>>>>> of >>>>>>>> the >>>>>>>> HTTP headers of the request, using standard Apache modules, might be >>>>>>>> enough >>>>>>>> to get just the user. >>>>>>>> >>>>>>>> That was a long message, but in the end the answer may be simple. >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> --------------------------------------------------------------------- >>>>>>>> The official User-To-User support forum of the Apache HTTP Server >>>>>>>> Project. >>>>>>>> See <URL:http://httpd.apache.org/userslist.html> for more info. >>>>>>>> To unsubscribe, e-mail: [EMAIL PROTECTED] >>>>>>>> " from the digest: [EMAIL PROTECTED] >>>>>>>> For additional commands, e-mail: [EMAIL PROTECTED] >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> -- >>>>>>>> >>>>>>> Clayton Hicklin >>>>>>> [EMAIL PROTECTED] >>>>>>> >>>>>>> >>>>>>> Sorry about top-posting on that last message (stupid Gmail :). >>>>>>> >>>>>> So, it looks like I need mod_setenvif, right? Could anybody write a >>>>>> quick >>>>>> directive that would look at REMOTE_USER to see if there is a >>>>>> backslash >>>>>> ("\"), and if there is, set the same variable to everything following >>>>>> the >>>>>> backslash? I think this would solve my problem. I would rather use >>>>>> mod_authnz_ldap that mod_auth_sspi as it is included with Apache and >>>>>> is >>>>>> well-supported. >>>>>> >>>>>> >>>>>> I would try the following, but it's mod_headers, not mod_setenvif : >>>>>> >>>>> RequestHeader edit REMOTE_USER ^(?:[^\\]+\\)(.+)$ $1 >>>>> >>>>> the regexp should mean (if really it's a perl regexp) : >>>>> - for the first () group, match but do not capture >>>>> - match (potentially) from the beginning, anything before the backslash >>>>> and >>>>> the backslash itself, if any such things. >>>>> - then match whatever is left, and capture it as $1 >>>>> >>>>> then replace this all by $1 >>>>> >>>>> (the fancy maybe-match stuff is just in case you *don't* get a domain >>>>> sometimes) >>>>> >>>>> That's what I'm trying to do anyway, regexpes are painful (but nice). >>>>> >>>>> Please let us know if the whole solution works in the end. >>>>> >>>>> >>>>> >>>>> --------------------------------------------------------------------- >>>>> The official User-To-User support forum of the Apache HTTP Server >>>>> Project. >>>>> See <URL:http://httpd.apache.org/userslist.html> for more info. >>>>> To unsubscribe, e-mail: [EMAIL PROTECTED] >>>>> " from the digest: [EMAIL PROTECTED] >>>>> For additional commands, e-mail: [EMAIL PROTECTED] >>>>> >>>>> >>>>> Andre, >>>>> >>>> The regex does not compile, according to the Apache error log. The >>>> manual >>>> says Apache uses PCRE, btw. I will see if I can figure out where the >>>> error >>>> is. >>>> >>>> Strange : >>>> >>> #!/usr/bin/perl -w >>> use strict; >>> >>> my $RU = "domain\\user"; >>> $RU =~ m/^(?:[^\\]+\\)(.+)$/; >>> my $user = $1; >>> print "1) User : $user\n"; >>> >>> $RU = "user"; >>> $RU =~ m/^(?:[^\\]+\\)(.+)$/; >>> $user = $1; >>> print "2) User : $user\n"; >>> >>> exit; >>> >>> >>> output : >>> >>> 1) User : user >>> 2) User : user >>> >>> >>> Maybe under Apache, it escapes the backslashes automatically by itself ? >>> Try : >>> >>> ^(?:[^\]+\)(.+)$ >>> >>> >>> >>> --------------------------------------------------------------------- >>> The official User-To-User support forum of the Apache HTTP Server >>> Project. >>> See <URL:http://httpd.apache.org/userslist.html> for more info. >>> To unsubscribe, e-mail: [EMAIL PROTECTED] >>> " from the digest: [EMAIL PROTECTED] >>> For additional commands, e-mail: [EMAIL PROTECTED] >>> >>> >>> It keeps saying "regex could not compile" even though I can get it to >> work >> in the regex tester. Weird. >> >> I think it might not like my (?:...) construct. That's probably "extended > PCRE" stuff. > Let's try another one : > > RequestHeader edit REMOTE_USER ^([^\\]+\\)?(.+)$ $2 > > (hoping that $1 gets set even to '' if there is no domain) > (and yes, the "replacement part" is now $2) > > > > --------------------------------------------------------------------- > The official User-To-User support forum of the Apache HTTP Server Project. > See <URL:http://httpd.apache.org/userslist.html> for more info. > To unsubscribe, e-mail: [EMAIL PROTECTED] > " from the digest: [EMAIL PROTECTED] > For additional commands, e-mail: [EMAIL PROTECTED] > > Same error. I wonder, does my Apache need access to a PCRE implementation (i.e. PERL) or is that compiled in? Maybe that's the problem. -- Clayton Hicklin [EMAIL PROTECTED]