Se vi è mai capitato di andare a leggere le informazioni riguardo l'utente corrente nell'evento BeginRequest di un HttpModule, vi sarete accorti che la proprietà HttpContext.Current.User è ancora a null.
Questo perchè la richiesta è stata appena sottoposta ad ASP.NET, mentre, se provate a leggerne il contenuto dell'evento EndRequest, troverete tutte le informazioni sull'utente corrente (sempre che sia autenticato).
Esiste un modo però, per arrivare lo stesso a quelle informazioni.
Dichiarando l'utilizzo della Forms Authentication in questo modo:
<authentication mode="Forms">
<forms name=".ASPXAUTH" loginUrl="login.aspx"/>
</authentication>
all'interno dell'HttpModule è possibile prelevare informazioni dal cookie di chi esegue la richiesta e creare un nuovo oggetto di tipo GenericPrincipal. Vediamo come:
public class DefaultHttpModule : IHttpModule
{
public void Init(HttpApplication context)
{
context.BeginRequest += new EventHandler(context_BeginRequest);
}
void context_BeginRequest(object sender, EventArgs e)
{
HttpContext context = HttpContext.Current;
HttpCookie cookie = context.Request.Cookies.Get(".ASPXAUTH");
if (cookie != null)
{
FormsAuthenticationTicket fat = FormsAuthentication.Decrypt(cookie.Value);
string[] roles = Roles.GetRolesForUser(fat.Name);
GenericIdentity identity = new GenericIdentity(fat.Name);
GenericPrincipal principal = new GenericPrincipal(identity, roles);
//... }
}
}