您最喜欢的“当前用户” - Asp.net应用程序的模式?

时间:2010-11-26 15:52:01

标签: asp.net asp.net-mvc authentication design-patterns

您在Asp.NET应用程序中看到或用于访问当前登录用户的最好的模式是什么?

当前用户是指代表您的系统中的用户的业务对象,无论是成员资格用户对象还是自定义类。 用户对象应该很容易在全局(httpapplication对象),Web表单,控制器,webhandler等地方到达。它可能被发送到项目的后端层,有时会注入其他业务对象,具体取决于你的申请。

要求:

  • 在MVC和WebForms中都很好地工作。
  • 该模式应该能够使用aspnet成员资格类或拥有“用户”的类。
  • 未登录时清晰明了的处理方式。

2 个答案:

答案 0 :(得分:2)

我实际上对已经内置的ASP.NET很满意:

if (User.Identity.IsAuthenticated)
{
    string currentlyLoggedUsername = User.Identity.Name;
    // TODO: Now given this username you could query your repository
    // or the Membership provider to fetch additional user information.
}

答案 1 :(得分:2)

这是我用来存储一个对象而不是一个我觉得不太有用的名字。

在我的帐户管理员中:

    public static User CacheUserInSession(User user)
    {
        Contract.Assert(user != null);

        if (user == null) // Not found, name may have changed
        {
            new FormsAuthenticationService().SignOut();
        }
        else
        {
            // Save off the user for later use by other classes
            ContextCache<User>.Set(user, ContextCache.AspNetUserSessionCache);
            ContextCache<int>.Set(user.RowId, ContextCache.UserIdSessionCache);
        }

        return user;
    }

    public static User GetUserFromSession()
    {
        var user = ContextCache<User>.Get(ContextCache.AspNetUserSessionCache);

        return user;
    }

我的缓存类:

public class ContextCache<T>
{    
    public static void Set(T objectToCache, string key)
    {
        System.Web.HttpContext.Current.Items.Add(key, objectToCache);
    }

    public static T Get(string key)
    {
        return (T)System.Web.HttpContext.Current.Items[key];
    }

}

我从Application_AuthenticateRequest调用CacheUserInSession传递我从数据库中读取的User对象/模型。

当我想要检索用户时,我会拨打这个电话:

var user = AccountController.GetUserFromSession();

使用缓存包装器,您可以存储/检索任何类型的对象。

没有一团糟。不用大惊小怪。