Мне нелегко реализовывать, "Помнят Меня" функциональность в приложении MVC с пользовательским принципалом. Я свел его к ASP.NET, не получающему cookie аутентификации для меня. Я включал снимок ниже от Google Chrome.
Показывает результаты Запроса. Cookie, который установлен в рамках действия контроллера и помещен в ViewData для представления для чтения. Заметьте, что это пропускает.ASPXAUTH cookie
Показывает результаты инструментов разработчика Chrome. Вы видите, что.ASPXAUTH включен здесь.
Какова может быть проблема здесь? Почему ASP.NET не читает это значение из набора cookie?
Мое приложение использует пользовательский IPrincipal. BusinessPrincipalBase является объектом CSLA это, ust реализует 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
}
Я не думаю, что любое из этого связано, потому что нижняя строка то, что Запрос. Cookie не возвращают cookie аутентификации. Это связано с размером cookie? Я слышал, что существуют проблемы к размеру cookie.
ОБНОВЛЕНИЕ: кажется, что проблема вращается вокруг субдоменов. Этот сайт размещался с субдоменом, и домен cookie был оставлен незаполненный. У кого-либо есть какие-либо указатели о том, как я могу заставить подлинный cookie работать со всеми доменами (например, http://example.com, http://www.example.com и http://sub.example.com)?
Вы тоже это проверяли?
Файл cookie ASPXAUTH не сохраняется
Я не уверен, что это может быть причиной того, что файл cookie отображается в Chrome, но не передается в браузер, или это может помешать сохранению файла cookie, но также стоит взгляд.
Если вы пытаетесь сохранить фактический объект User в самом файле cookie, он, вероятно, слишком велик для сохранения в качестве файла cookie. Я не слишком знаком с аутентификацией MVC, но в веб-формах я обычно делаю следующее:
FormsAuthentication.RedirectFromLoginPage(user_unique_id_here, false);
Второй параметр - постоянство, которое вы ищете.
Оттуда я создаю настраиваемый контекст (UserContext), который заполняю через HttpModule, который дает мне доступ ко всей информации о пользователях и ролях.
Поскольку я не занимаюсь разработкой в MVC (пока) или CSLA, я не уверен, насколько еще я могу помочь. На вашем месте я бы также отказался от индивидуального поставщика членства. С таким же успехом вы можете просто вызвать MoralePrincipal.Login прямо в вашем контроллере аутентификации.
ЗапоминаниеMe должно быть установлено с помощью FormsAuthenticationService (в MVC2) или статическим классом FormsAuthentication в MVC1, если вы используете «обычный» код AccountController. Если вы изменили этот код, не забыли ли вы добавить (необязательный) логический параметр, указывающий, следует ли использовать постоянный файл cookie или нет?
Мне кажется, вы получаете файл cookie сеанса, но не постоянный файл cookie.