6

我启动了一个 ASP.NET MVC 2 项目,并且正在构建自动生成的代码。

我遇到的问题是,在用户登录后,新登录用户的配置文件似乎没有加载到 中HttpContext,所以我收到一条ProviderException消息“无法为匿名用户设置此属性" 尝试在当前用户的配置文件中设置属性值时。

对于 POST-only LogOn 动作,Visual Web Developer 2010 Express 基本生成:

    [HttpPost]
    public ActionResult LogOn(LogOnModel model, string returnUrl)
    {
        if (ModelState.IsValid)
        {
            if (MembershipService.ValidateUser(model.UserName, model.Password))
            {
                FormsService.SignIn(model.UserName, model.RememberMe);
        //...

其中FormsService是类型控制器的属性FormsAuthenticationService(也生成):

public class FormsAuthenticationService : IFormsAuthenticationService
{
    public void SignIn(string userName, bool createPersistentCookie)
    {
        if (String.IsNullOrEmpty(userName)) throw new ArgumentException("Value cannot be null or empty.", "userName");

        FormsAuthentication.SetAuthCookie(userName, createPersistentCookie);
    }

    public void SignOut()
    {
        FormsAuthentication.SignOut();
    }
}

在这FormsService.SignIn(model.UserName, model.RememberMe)行之后,我假设新登录帐户的信息将立即可供控制器使用,但情况似乎并非如此。例如,如果我profile.SetPropertyValue("MyProfileProperty", "test")在对 FormsService#SignIn 的调用下方添加,则会得到ProviderException“无法为匿名用户设置此属性”。

如何将新登录用户的个人资料加载到 中,HttpContext以便在下一次请求之前在他或她的个人资料中设置属性值?

4

2 回答 2

7

该函数的命名与直觉相反,但 ProfileBase.Create(username) 将为现有用户加载现有配置文件,如果不存在则创建新配置文件。

var profile = ProfileBase.Create(userName);

这不会将配置文件加载到其中ControllerContext.HttpContext.Profile,但至少您可以访问或更改用户配置文件。

于 2011-01-19T16:08:21.627 回答
1

MVC 模板中内置的“原始”表单身份验证不会自动加载配置文件。它所做的只是根据成员资格表验证用户并设置登录 cookie。如果您希望配置文件数据在登录时保留在会话状态中,则必须明确执行此操作:

[HttpPost]
    public ActionResult LogOn(LogOnModel model, string returnUrl)
    {
        if (ModelState.IsValid)
        {
            if (MembershipService.ValidateUser(model.UserName, model.Password))
            {
                FormsService.SignIn(model.UserName, model.RememberMe);
                LoadProfile(model.UserName);
            }
     }

     private void LoadProfile(string UserName)
     {
          MyModelContext ctx = new MyModelContext(); //EF or LINQ2SQL context
          var user = ctx.Users.Where(u => u.UserName == UserName).FirstOrDefault();
          Session.Add("CurrentUser", user);
     }

更新:

我误解了原来的问题。ProfileCommon您必须为匿名用户创建并保存类型的配置文件。看到这个帖子:

http://forums.asp.net/p/1150958/2619264.aspx

于 2011-01-19T15:56:33.227 回答