ASP.NET MVC身份验证Cookie未被检索

时间:2010-06-07 11:43:36

标签: asp.net asp.net-mvc cookies

我很难在带有自定义主体的MVC应用程序中实现“记住我”功能。我把它归结为ASP.NET而不是为我检索身份验证cookie。我在Google Chrome中添加了一张快照。

  1. 显示在控制器操作中设置并放置在ViewData中以供视图读取的Request.Cookies的结果。请注意,它缺少.ASPXAUTH cookie

  2. 显示Chrome开发者工具的结果。你可以看到.ASPXAUTH包含在这里。

  3. alt text http://i50.tinypic.com/ibctjd.png

    这可能是什么问题?为什么ASP.NET不从cookie集合中读取此值?

    我的应用程序使用自定义IPrincipal。 BusinessPrincipalBase是一个CSLA对象,它实现了IPrincipal。这是代码:

    [Serializable()]
    public class MoralePrincipal : BusinessPrincipalBase
    {
        private User _user;
    
        public User User
        {
            get
            {
                return _user;
            }
        }
    
        private MoralePrincipal(IIdentity identity) : base(identity)
        {
            if (identity is User)
            {
                _user = (User)identity;
            }
        }
    
        public override bool Equals(object obj)
        {
            MoralePrincipal principal = obj as MoralePrincipal;
            if (principal != null)
            {
                if (principal.Identity is User && this.Identity is User)
                {
                    return ((User)principal.Identity).Equals(((User)this.Identity));
                }
            }
            return base.Equals(obj);
        }
    
        public override int GetHashCode()
        {
            return base.GetHashCode();
        }
    
        public static bool Login(string username, string password)
        {
            User identity = User.Fetch(username, password);
            if (identity == null || !identity.IsAuthenticated)
            {
                identity = (User)User.UnauthenicatedIdentity;
            }
    
            MoralePrincipal principal = new MoralePrincipal(identity);
            Csla.ApplicationContext.User = principal;
            Context.Current.User = identity;
    
            return identity != null && identity.IsAuthenticated;
        }
    
        public static void Logout()
        {
            IIdentity identity = User.UnauthenicatedIdentity;
            MoralePrincipal principal = new MoralePrincipal(identity);
            ApplicationContext.User = principal;
            Context.Current.User = identity as User;
        }
    
        public override bool IsInRole(string role)
        {
            if (Context.Current.User == null || Context.Current.Project == null)
            {
                return false;
            }
    
            string userRole = Context.Current.User.GetRole(Context.Current.Project.Id);
            return string.Compare(role, userRole, true) == 0;
        }
    

    该应用程序还使用自定义成员资格提供程序。这是代码。

    public class MoraleMembershipProvider : MembershipProvider
    {
        public override bool ValidateUser(string username, string password)
        {
            bool result = MoralePrincipal.Login(username, password);
            HttpContext.Current.Session["CslaPrincipal"] = ApplicationContext.User;
            return result;
        }
    
        #region Non-Implemented Properties/Methods
    
        public override string ApplicationName
        {
            get
            {
                return "Morale";
            }
            set
            {
                throw new NotImplementedException();
            }
        }
    
        // Everything else just throws a NotImplementedException
    
        #endregion
    }
    

    我不认为这有任何关联,因为底线是Request.Cookies不返回身份验证cookie。它与cookie的大小有关吗?我听说cookie有大小问题。

    更新:似乎该问题围绕子域进行。此站点使用子域托管,cookie域保留为空。有没有人知道如何让auth cookie与所有域一起使用(例如http://example.comhttp://www.example.comhttp://sub.example.com)?

3 个答案:

答案 0 :(得分:1)

你也检查过这个吗?

ASPXAUTH cookie is not being saved

我不确定这是否会导致cookie显示在chrome中但实际上没有传递给浏览器,或者是否会阻止cookie保存但也值得一看。

答案 1 :(得分:1)

如果您尝试将实际的User对象存储在cookie本身中,那么它可能太大而无法存储为cookie。我不是太熟悉MVC身份验证的东西,但在网络表单中我通常会做以下事情:

FormsAuthentication.RedirectFromLoginPage(user_unique_id_here, false);

第二个参数是您要查找的持久性。

从那里我创建了一个自定义上下文(UserContext),我通过HttpModule填充它,使我可以访问所有用户和角色信息。

由于我没有在MVC(尚未)或CSLA中开发,我不确定我能提供多少帮助。如果我是你,我也会放弃自定义会员提供商。您也可以直接在身份验证控制器中调用MoralePrincipal.Login。

答案 2 :(得分:1)

如果您正在使用“常规”AccountController的代码,那么rememberMe内容应该由FormsAuthenticationService(在MVC2中)或MVC1中的FormsAuthentication静态类设置。如果您更改了该代码,您是否记得添加(可选)布尔参数,指示是否使用持久性cookie?

听起来像你正在获取会话cookie,但不是持久性cookie。