Here is the code exactly as I have it in the global.asax.
Sub FormsAuthentication_OnAuthenticate(ByVal s As Object, ByVal e
As
FormsAuthenticationEventArgs)
If HttpContext.Current.Request.Path =
"/ArgoWeb/ReminderCheck.aspx"
Then
e.User = New GenericPrincipal(New
GenericIdentity(String.Empty,
String.Empty), New String() {""})
End If
End Sub
I stepped through it and the function does get called on every page
and the
IF statement does give way on the correct page.
The expiration ticket however still gets refreshed when I inspect it
in the
OnLoad event of the "ReminderCheck.aspx" page. Both IssuedDate and
ExpireDate get new values on every request. I have tested this with
2
min
login timeout and "ReminderCheck.aspx" being called every 5 seconds
to
expedite the test.
How do you know what code is in the OnAuthenticate() method? Isn't
that compiled in the MS library? Is there away to override this
method?
Thanks
Perry
Are you sure setting e.User = something doesn't work? Here's the
code from the FormsAuthModule where it renews the ticket:
private void OnAuthenticate(FormsAuthenticationEventArgs e)
{
HttpCookie cookie1 = null;
if (this._eventHandler != null)
{
this._eventHandler(this, e);
}
if ((e.Context.User != null) || (e.User != null))
{
e.Context.User = (e.Context.User == null) ? e.User :
e.Context.User;
}
else
{
// does the work to renew the ticket
}
}
the line where it calls "this._eventHandler(this, e);" should be
your
code in global.asax. So inspecting this code says to me that if the
event assigns a User then there's no need to renew the ticket.
Ok I got the event in the global.asax and it does fire however
this is just an event not an override so unfortunately the
expiration timeout is still refreshed since the MS Authenticate
code is still executing. Not only that but setting the e.User as
you have in the example makes that page get redirected to the
login screen because it fails authentication.
Got any more ideas?
Thanks
Perry
The event handler goes in global.asax. Modules that fire events
can have those events handled in global.asax via
ModuleName_EventName syntax. Here's the event decl:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/
cp re
f/html/frlrfsystemwebsecurityformsauthenticationmoduleclassauthen
ti ca tetopic.asp?frame=true
I searched the whole MSDN library and there is no OnAuthenticate
event. This is a good idea but how do I override this event and
where is this event?
The closest I could find is "AddOnAuthenticateRequestAsync" but
I have no idea how to implement this. It does not even show in
the methods that can be overriden in the IDE. It passes two
delegates and this async stuff makes me shudder. I could not
find any examples of how this works.
Thanks
Perry
Maybe there is another way to prevent the auth ticket from
updating for a specified page. Can't this process be
intercepted and overriden in some place?
Actually, there is one other idea. The FormsAuthModule fires a
OnAuthenticate event which you can use to specify the user. If
you specify a method:
void FormsAuthentication_Authenticate(object s,
FormsAuthenticationEventArgs e)
{
if (HttpContext.Current.Request.Path ==
"ThePathIWantToIgnore.aspx")
{
e.User = new GenericPrincipal(new GenericIdentity(string.Empty,
string.Empty), new string[0]);
}
}
If you specify the identity, it won't be read from the forms
auth
cookie, and you won't get the extention of the cookie timeout.
I
don't know why I didn't think of this earlier.