Asp.net Formauthentication中“Hhtpcontext.user”的角色

时间:2009-07-19 08:23:53

标签: asp.net-2.0

在asp.net global.asax中,我应该在哪里编写代码来在httpcontext.user中分配角色?

我在网站上读到的内容是它应该是global.asax的“Application_onPostauthentication”事件的一部分,但是如果我在那里写的那么我就没有得到它然后它是针对用户的每个请求执行的。我认为这应该在会话中获取一对一的身份验证。

我甚至不知道为什么微软还建议在那里编写代码?如果有人知道事实让我说清楚了吗?

1 个答案:

答案 0 :(得分:1)

使用.NET 2.0,您可以使用the built-in role management feature来处理为您设置角色。

对于.NET 1.1,或者如果某些原因您不能或不想使用内置角色管理,那么PostAuthenticateRequest事件是一个很好的做法。

会话不用于存储角色,因为(a)会话的生命周期完全独立于表单authenticnticatio cookie的生命周期,(b)甚至可能无法启用会话。

需要在每个请求上设置角色,但这不是问题。您不需要每次都从数据库(*)中检索它们 - 您可以将它们缓存到某个地方。在Session中缓存它们是一个合理的解决方案,但是如果你在那里找不到它们,你需要包含从数据库中重读的代码。

(*)或存储它们的任何地方。

修改

例如,要在Session中缓存角色,您可以执行以下操作:

string[] GetRoles(string userName)
{
    string[] roles = Session["Roles"] as string[];
    if (roles == null)
    {
       roles = GetRolesFromDatabase(userName);
       Session["Roles"] = roles;
    }
    return roles;
}

或者,您可以通过将角色存储在ASP.NET缓存中来避免对Session的依赖,可能是滑动到期。缓存在所有请求之间共享,因此您需要使用用户名作为缓存密钥的一部分:

string[] GetRoles(string userName)
{
    string cacheKey = "Roles:" + userName;

    string[] roles = Cache[cacheKey] as string[];
    if (roles == null)
    {
       roles = GetRolesFromDatabase(userName);
       Cache.Insert(cacheKey, roles, ...);
    }
    return roles;
}