I've been starting to look into JASPI (Java Authentication Service Provider Interface, http://jcp.org/en/jsr/detail?id=196 ) and also trying to figure out how to remove the convoluted remote login code in geronimo and am starting to think that I might have an idea how to do both. Note that my understanding of JASPI might not be complete :-)

JASPI has two halves, the client side and the server side. Depending on what you are doing, you might only be using one, e.g. for a web app you aren't likely to have a client side since it's a browser not a java program. I think its more or less a generalization of the Authenticator interfaces servlet containers typically use.

On either side you supply a layer id and an application id and get an authentication provider for that combination.

For a message/response cycle the sequence of events goes something like this:

1. (client) Client asks the client authConfig to stuff some info into the request message.

2. (server) server asks the server authConfig to authenticate based on the request message. There are a bunch of complicated scenarios, but in a simple case you are now authenticated.

--server processes the message and gets ready to return a response

3. (server) server asks the server authConfig to stuff some info into the reply message

4. (client) client asks the client authConfig to validate the response message based on the info from the server.

The functions of the client and server side authentication configs seem to me to be very similar to the openejb IdentityResolver and SecurityService interfaces

I think we can use this to eliminate the need for mysterious remote login yet provide for "sessions" so we don't need to log in for each request. My thinking is heavily influenced by what's going on in the geronimo-openejb integration right now, so it might not correspond quite as well to current openejb standalone. Here's my idea:

1. On the first request, the client figures out what identity and credentials to use for the session and adds them to the request message. For instance this could be username and password.

2. The server sees the credentials in the request and logs in. It generates a token to identify the "session". In geronimo this is currently stored in an IdentificationPrincipal in the Subject.

3. the server includes the token in the reply message

4. the client extracts the token from the reply message and saves it with the caller's security information. For instance it could put it in the private credentials of the user's subject.

5. On subsequent calls the client includes the token in the request message rather than including the credentials.

6. When the server sees the token in the request message it locates the appropriate security context (such as the Subject from the first login).

To make this work in openejb I think we need more or less 2 changes:

1. IdentityResolver and SecurityService need to be more jaspi- friendly. I think this means that we need "processResponse" type methods, and both these and the existing "processRequest" type methods need to include the layer and applicationId parameters. I'm still wondering what the exact meaning of layer and appId might best be, but at the moment I think that having the layer identify the transport in some way and the appId identify either the ejbmodule or the ejb itself would work. In the geronimo corba-openejb implementation you can specify separate security policies for each ejb and (I think and hope) transport. Also in JACC each ejb gets a separate PolicyContextId so I think that having appId == ejbId would be most appropriate.

2. The response object needs to include some security information, just as the request object does.

------------------
I've been experimenting in geronimo with a little bit of this: I am sending the credentials on each request and logging in for each request, and this seems to be working fine. This avoids the mysterious remote login but is presumably somewhat inefficient for multiple calls since logging in generally takes some work. This does require tracking a bit more information such as security realm name so I'm starting to think that going directly for a jaspi or jaspi- like implementation might make sense.

Comments?  Comments on an appropriate timeframe?

thanks
david jencks

Reply via email to