none
使用FormsAuthentication+Profile的时候遇到一个很麻烦的问题 RRS feed

  • 问题

  • 在登录页面中,用户进行了登录,且成功登录。我使用这样的代码为用户创建票据:
    FormsAuthentication.SetAuthCookie("Hugo", false);

    bool
    isLogin = this.User.Identity.IsAuthenticated;
    但是这个时候isLogin仍然为false。只有当用户进行了下一次请求到达服务器段后这个值才为true。为什么会这样?
    在我的web应用程序中,在用户登录成功后我需要使用profile保存一些信息。为profile设置值的代码应该放在什么地方呢?我不能放在FormsAuthentication.SetAuthCookie("Hugo", false);的下面,因为这个时候服务器段还不认识当前的用户,他的UserName还是由服务器段分配的。我应该把这段代码放在什么地方呢?
    郭鹏
    2009年8月31日 8:47

答案

  • 你好 你可以在MigrateAnonymous事件中实现



    public void Profile_OnMigrateAnonymous(object sender, ProfileMigrateEventArgs args)
    {
      ProfileCommon anonymousProfile = Profile.GetProfile(args.AnonymousID);
    
      Profile.ZipCode = anonymousProfile.ZipCode;
      Profile.CityAndState = anonymousProfile.CityAndState;
      Profile.StockSymbols = anonymousProfile.StockSymbols;
    
      ////////
      // Delete the anonymous profile. If the anonymous ID is not 
      // needed in the rest of the site, remove the anonymous cookie.
    
      ProfileManager.DeleteProfile(args.AnonymousID);
      AnonymousIdentificationModule.ClearAnonymousIdentifier(); 
    }
    


    Wenn ich dich hab’,gibt es nichts, was unerträglich ist.坚持不懈!http://hi.baidu.com/1987raymond
    2009年8月31日 9:19
    版主
  • 1987raymond 您好,多谢你的指导,请问这段代码在什么情况下会被执行呢?我放在什么地方?Login页面的后台cs代码中?还是什么地方?
    郭鹏

    Global.asax文件中  中文叫 全局应用程序类
    2009年8月31日 9:35
  • lz,您好,
    也可参考我之前关于该问题的讨论,有完整的例子,但没有采用profile,可以看出完整的验证过程:
    http://social.microsoft.com/Forums/zh-CN/295/thread/19c42801-f25c-408a-91f7-485a70cf5c58
    2009年8月31日 9:53
    版主

全部回复

  • FormsAuthentication.SetAuthCookie 是产生客户端加密的Cookie 这样就代表验证通过! 下一次当访问需要验证的页面时候 ,服务器就读取Cookie ,进行验证,不需要转到登陆页面
    bool isLogin = this.User.Identity.IsAuthenticated;是多余的
    2009年8月31日 9:02
  • 你好 你可以在MigrateAnonymous事件中实现



    public void Profile_OnMigrateAnonymous(object sender, ProfileMigrateEventArgs args)
    {
      ProfileCommon anonymousProfile = Profile.GetProfile(args.AnonymousID);
    
      Profile.ZipCode = anonymousProfile.ZipCode;
      Profile.CityAndState = anonymousProfile.CityAndState;
      Profile.StockSymbols = anonymousProfile.StockSymbols;
    
      ////////
      // Delete the anonymous profile. If the anonymous ID is not 
      // needed in the rest of the site, remove the anonymous cookie.
    
      ProfileManager.DeleteProfile(args.AnonymousID);
      AnonymousIdentificationModule.ClearAnonymousIdentifier(); 
    }
    


    Wenn ich dich hab’,gibt es nichts, was unerträglich ist.坚持不懈!http://hi.baidu.com/1987raymond
    2009年8月31日 9:19
    版主
  • 有没有办法在FormsAuthentication.SetAuthCookie("Hugo", false);运行后就立刻让服务器认识这个用户?


    郭鹏
    2009年8月31日 9:20
  • 有没有办法在FormsAuthentication.SetAuthCookie("Hugo", false);运行后就立刻让服务器认识这个用户?


    郭鹏

    执行这个语句在客户端创造了cookie了 这个cookie没有返回到服务器上 所以无法立刻认识的
    2009年8月31日 9:26
  • 1987raymond 您好,多谢你的指导,请问这段代码在什么情况下会被执行呢?我放在什么地方?Login页面的后台cs代码中?还是什么地方?
    郭鹏
    2009年8月31日 9:31
  • 1987raymond 您好,多谢你的指导,请问这段代码在什么情况下会被执行呢?我放在什么地方?Login页面的后台cs代码中?还是什么地方?
    郭鹏

    Global.asax文件中  中文叫 全局应用程序类
    2009年8月31日 9:35
  • lz,您好,
    也可参考我之前关于该问题的讨论,有完整的例子,但没有采用profile,可以看出完整的验证过程:
    http://social.microsoft.com/Forums/zh-CN/295/thread/19c42801-f25c-408a-91f7-485a70cf5c58
    2009年8月31日 9:53
    版主
  • 1987raymond 您好,多谢你的指导,请问这段代码在什么情况下会被执行呢?我放在什么地方?Login页面的后台cs代码中?还是什么地方?
    郭鹏

    Global.asax文件中  中文叫 全局应用程序类

    正解~~~~
    Wenn ich dich hab’,gibt es nichts, was unerträglich ist.坚持不懈!http://hi.baidu.com/1987raymond
    • 已标记为答案 Hugo12345 2009年8月31日 11:58
    • 取消答案标记 Hugo12345 2009年8月31日 11:58
    2009年8月31日 10:09
    版主
  • Profile_OnMigrateAnonymous 在什么情况下会运行呢?
    郭鹏
    2009年8月31日 11:58
  • Profile_OnMigrateAnonymous 在什么情况下会运行呢?
    郭鹏

    一般情况下在验证之后执行的 就是移动到验证的用户上profile数据
    2009年8月31日 12:06