[Zope] single sign-on
Luca Olivetti
luca at wetron.es
Fri Apr 7 05:07:05 EDT 2006
En/na Fernando Martins ha escrit:
> David H wrote:
>> Robert,
>>
>> You can python + COM your way to a browser startup zope/plone login
>> screen. I cannot see how you automate the authentication of a given
>> browser instance that is then handed to your users.
>>
>
> Hmm, that's not automation in this sense. The user logins into the
> workstation (Windows, don't know about unix), the user opens the browser and
> accesses an INTRANET page. The browser (IE or Firefox with NTLM setup) will
> then send authentication information to the Intranet server using the NTLM
> protocol. The web server (Apache with NTLM module) checks with some internal
> Domain server and sets the environmental variable REMOTE_USER. This is then
> sent to a CGI or FastCGI app (zope with FastCGI).
>
>> Maybe someone will correct this. If so everyone's happy.
>
> Yes, local Intranet users love this, one less login, automatic recognition,
> personalisation, instant gratification,... ;-)
It seems it is possible but a little convoluted.
WARNING this has only had very limited testing and it's *not* in
production (and I'm not sure it will ever be).
The first hurdle is that with the proxying configuration (RewriteRule
with the P flag) ntlm_mod sends "Proxy-Authenticate" instead of
"WWW-Authenticate" and it didn't work, so the first thing I needed to do
was to modify ntlm_mod.c to always request "WWW-Authenticate" (easy to
do, just find any instance of "r->proxyreq" and change it to
"r->proxyreq && 0". I didn't see this reported anywhere, so it could
just be my local setup with apache 2.
Then in Apache I used the RequestHeader directive to add the remote user
to the request *and* the E option in the RewriteRule to put the remote
user in the environment (so that RequestHeader works),
i.e. (zope is served here under the test directory "t"):
<Location /t/>
AuthName "A Protected Place"
AuthType NTLM
NTLMAuth On
NTLMAuthoritative on
NTLMDomain YOURDOMAIN
NTLMServer yourhost
NTLMBasicAuth on
NTLMBasicRealm YOURREALM
require valid-user
RequestHeader set REMOTE_USER %{REMOTE_USER}e
</Location>
RewriteCond %{SERVER_PORT} ^443$
RewriteCond %{HTTP_HOST} !443$
RewriteRule ^/t/(.*)
http://localhost:10080/VirtualHostBase/https/%{HTTP_HOST}:443/VirtualHostRoot/_vh_t/$1
[L,P,E=REMOTE_USER:%{LA-U:REMOTE_USER}]
RewriteCond %{SERVER_PORT} ^443$
RewriteCond %{HTTP_HOST} 443$
RewriteRule ^/t/(.*)
http://localhost:10080/VirtualHostBase/https/%{HTTP_HOST}/VirtualHostRoot/_vh_t/$1
[L,P,E=REMOTE_USER:%{LA-U:REMOTE_USER}]
RewriteCond %{SERVER_PORT} ^80$
RewriteRule ^/t/(.*)
http://localhost:10080/VirtualHostBase/http/%{HTTP_HOST}:80/VirtualHostRoot/_vh_t/$1
[L,P,E=REMOTE_USER:%{LA-U:REMOTE_USER}]
(note that this contortion with ssl may be due, again, to my setup. Note
also that I didn't manage to make ntlm+ssl work with internet explorer,
it works fine with firefox).
At this point zope should see an additional header REMOTE_USER (with the
consequent security risk: you should make sure that nobody can directly
access zope otherwise they can fake this header and pose as any user)
which is available in request.environ as HTTP_REMOTE_USER.
Then it's just a matter of using PAS with the SharkbyteSSOPlugin
(http://dev.plone.org/collective/browser/SharkbyteSSOPlugin) configured
to use HTTP_REMOTE_USER.
I'd suggest to change
userid = request.get(self.uservar)
to
userid = request.environ.get(self.uservar)
for a little more security - not that this setup seems really secure to
me anyway, but I'm not a security expert ;-)
Bye
--
Luca Olivetti
Wetron Automatización S.A. http://www.wetron.es/
Tel. +34 93 5883004 Fax +34 93 5883007
More information about the Zope
mailing list