I would think that non-persistent cookies would be the ticket.  Certainly dynamic 
realms would accomplish what you want, but really all your doing is using the realm 
like a cookie.

Cookies have a number of advantages.  For one thing, they're reasonably straight 
forward to manage.  Secondly, you can encrypt a timestamp on a cookie.  And that's 
important because WEB users are notoriously bad at remembering to logout.  The value 
of the timestamp is that it can become an idle timeout mechanism, so even if a user 
goes away and then comes back later, he or she has been logged out just based on 
inactivity.

-- Rob


--On Tuesday, December 19, 2000 06:28:16 PM +0000 [EMAIL PROTECTED] wrote:

> Hi there.
>
> I've been trying to write a system to perform authentication using the
> www-authenticate (http authenatication) method. However, I need a client visiting
> the page and having been authenticated to be able to logout and have their
> browser forget the information (or at least be able to force the browser to
> re-authenticate within the same browser session).
>
> As most browsers cache login details (sensibly - you don't want to enter your
> login details for each page you visit) the best system I can think of is to use
> dynamic realms. This would mean that when someone first visits the site, they
> will be given a random/sequential realm. When they then click on a logout button,
> the old realm is discarded, and if the browser tries to authenticate with the
> same realm it is refused (or alternatively the server just starts sending a
> different realm and the browser re-authenticates on the new realm).
> Significantly, the system needs to be accessible by several people
> simultaneously. The purpose is actually to allow someone accessing the site to
> log in, be served dynamic content on the basis of username (which I'm already
> doing), but have the option to log out and then back in as a different user.
>
> I've been looking at different ways to do this, but haven't had any sucess as of
> yet. My first attempt was to use the module mod_auth_external to deal with
> authentication using a perl script (which would allow me to arbitrarily refuse
> login details even if they are correct, on the basis of other details such as
> realm). This is my preferable method (mainly because I understand it), but it
> seems that there's no way to integrate the realm into the auth_external system.
> This means that although I could refuse a username and password, I can't change
> the realm dynamically, and so I can't force the browser to re-authenticate (and
> without the realm information being passed to the script, I don't know if a
> visitor has re-authenticated with the same username or if their browser has
> simply sent the cached copy of the details).
>
> After searching around for methods of dynamically assigning an authname, I
> stumbled across mod_perl. I've never in my life even looked at mod_perl (and I
> don't really understand object-oriented perl, I'm sorry to say - I came from a
> BASIC background - in more ways than one apparently). I also found an example
> script for assigning dynamic realms, but haven't been able to get it to work.
>
> I have only been trying for a day, and I know it's bad of me to resort to a
> mailing list after such a short space of time, but I've trawled the Web for as
> much information as I can find but with no success.
>
> The example mod_perl script I found was as follows:
>
> <From http://www.davin.ottawa.on.ca/archive/modperl/2000-09/msg00839.phtml>
>
> #############################################################################
>
> Here's a simple handler that will set the AuthType and AuthName
> dynamically and handle the authentication for you. This handler will
> prompt you for a password when you try to acess /manual with the
> AuthName, "The Manual" and prompt with the AuthName "The Icons" when you
> try to access /icons. These urls are part of Apaches basic installation
> (that's if you did not remove the manual from your htdocs directory).
> The authentication phase will let you in just as long you supply a
> username and password. You can of course code such that it you can
> authenicate against a .htpassword file, using Apache::Htpasswd.
>
> Anyhow, this should show you that you can indeed change the AuthName
> on-the-fly and also handle
> authentication without having to include AuthName,AuthType,AuthUserFile
> explicitly in your httpd.conf.
>
> Note: the authentication subroutine acted flaky, sometimes it worked and
> other times it didn't. But the realms did change for the each uri.
>
> i hope this helps you....have fun ;)
>
>
> Setting it up:
>
> In your httpd.conf ( in a global area):
>
> PerlHeaderParserHandler Apache::SetRealm;
>
>
> =code
>
> package Apache::SetRealm;
>
> use Apache;
> use Apache::Constants qw(:common);
> sub handler {
>     my $r   = shift;
>
>     ## Make Apache aware the we want to also handle the Authentication
> phase using a custom
>     ## handler, in this case the subroutine authenticate()
>           $r->push_handlers(PerlAuthenHandler => \&authenticate);
>     my $uri = $r->uri;
>
>    ## only handle uri that are defined as protected, in this case the
> only protected
>    ## uri's are /icons and /manuals
>     return OK unless is_protected($r);
>     my $realm = get_realm($r);
>
>     ## Construct the Header Field containing the type of authenticate
> (Basic) and our
>    ## realmname return by get_realm()
>     my $authheader = 'Basic realm="'.$realm.'"';
>
>     $r->header_out("WWW-Authenticate" ,$authheader);
>
>     ## Return 401 to browser and prompt for login
>     $r->status(AUTH_REQUIRED);
>     $r->send_http_header("text/html");
>     return AUTH_REQUIRED;
> }
>
> sub get_realm {
>      ## Get the AuthName for a specific uri. You can probably read these
> off of a file that
>      ## contains a list of uri's and realmNames
>       my $r = shift;
>       return "The Icons"  if ($r->uri =~ /\/icons/);
>       return "The Manual" if ($r->uri =~ /\/manual/);
> }
>
> sub is_protected {
>       ## Check the $uri requested matches our set of "Restricted"
> locations
>      ## 1 = isProtected, 0 = NotProtected
>      ## You can probably have these protected areas in a seperate file,
> the eagle book
>      ## has some excellent ideas on how to acomplish this
>       my $r = shift;
>       my @protected = ('\/manual','\/icons');
>
>       for (@protected) { return 1 if ($r->uri =~ /$_/); }
>       return 0;
> }
>
> sub authenticate {
>       ## Straight out of the Eagle Book
>     my $r = shift;
>
>     return OK if $r->sub_request;
>
>     my ($res,$password) = $r->get_basic_auth_pw;
>     return $res if $res != OK;
>
>     my $username = $r->connection->user;
>     unless ($username && $pass) {
>            $r->note_basic_auth_failure;
>            $r->log_reason("Did not provide username");
>            return AUTH_REQUIRED;
>     }
>
>     ## Now that you have the $username and $password you can
>     ## include your code to open your AuthUserFile to check the password
> and username
>     ## I suggest using Apache::Htpasswd, it provides all the
> methods/functions that you need to
>     ## accomplish this part of the task...
>
>     $r->log_reason("WELCOME $user");
>     return OK;
>
> }
>
> #############################################################################
>
> I've made some minor changes (but the changes all seem to work). The specific
> error I'm getting now is relating to the line:
>
>     return OK if $r->sub_request;
>
> ... in the authenticate subroutine. The error which appears in the apache error
> logs is:
>
>     [Tue Dec 19 17:32:04 2000] [error] Can't locate object method "sub_request"
>     via package "Apache" at
>     /usr/lib/perl5/5.6.0/i386-linux/raxware/AssignRealm.pm line 85.
>
> As I say, I'm new to mod_perl and object-oriented perl, so maybe this is simple
> to solve, but I can't find any online reference to the same error, or any
> reference to the purpose of the method 'sub_request'.
>
>
> Basically I was hoping someone could point me in the right direction for what to
> try next. If there is something available already which does what I want (I want
> to avoid cookie tracking due to the problems of cookie support, and URI tracking
> for security reasons - also, as HTTP has an authentication system, I may as well
> try to use it) that would be great. Alternatively, if someone could suggest a
> good online tutorial or manual for the mod_perl system or suggest a possible
> solution to the above error, that would also be great. Lastly, if anyone has
> tried anything similar (or hasn't) and has any pointers or suggestions for
> alternative methods, they would be much appreciated.
>
> Any advice would be gratefully received.
>
> Cheers,
>
> Andy.
> --
> Beauty is in the eye of the beholder... Oh, no - it's just an eyelash.




       _ _ _ _           _    _ _ _ _ _
      /\_\_\_\_\        /\_\ /\_\_\_\_\_\
     /\/_/_/_/_/       /\/_/ \/_/_/_/_/_/  QUIDQUID LATINE DICTUM SIT,
    /\/_/__\/_/ __    /\/_/    /\/_/          PROFUNDUM VIDITUR
   /\/_/_/_/_/ /\_\  /\/_/    /\/_/
  /\/_/ \/_/  /\/_/_/\/_/    /\/_/         (Whatever is said in Latin
  \/_/  \/_/  \/_/_/_/_/     \/_/              appears profound)

  Rob Tanner
  McMinnville, Oregon
  [EMAIL PROTECTED]

PGP signature

Reply via email to