Mam trudności z zaimplementowaniem funkcji "Zapamiętaj mnie" w aplikacji MVC z niestandardową wartością główną. Sprowadziłem to do ASP.NET, nie pobierając dla mnie pliku cookie uwierzytelniającego. Załączam snaphot poniżej z Google Chrome.Uwierzytelnianie plików cookie ASP.NET MVC nie jest pobierane (zaktualizowane)
Pokazuje wyniki Request.Cookies który mieści się na terenie działania kontrolera i umieszczonych w ViewData w celu odczytania. Zauważ, że brakuje pliku cookie .ASPXAUTH.
Wyświetla wyniki z narzędzi programistycznych Chrome. Widać, że .ASPXAUTH jest tutaj.
alt text http://i50.tinypic.com/ibctjd.png
Czy ktoś wie co może być tutaj problem? Dlaczego program ASP.NET nie odczytuje tej wartości z kolekcji plików cookie?
Moja aplikacja używa niestandardowego IPrincipala. BusinessPrincipalBase jest obiektem CSLA, który implementuje IPrincipal. Oto kod:
[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;
}
Aplikacja korzysta również z dostawcy członkostwa niestandardowego. Oto kod dla tego.
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
}
Nie sądzę, że to wszystko jest powiązane, ponieważ najważniejsze jest to, że Request.Cookies nie zwraca pliku cookie uwierzytelniającego. Czy jest on powiązany z rozmiarem pliku cookie? Słyszałem, że są problemy z wielkością pliku cookie.
AKTUALIZACJA: Wydaje się, że problem dotyczy subdomen. Ta witryna była hostowana z subdomeną, a domena cookie pozostawiona była pusta. Czy ktoś ma jakieś wskazówki, w jaki sposób mogę uzyskać plik cookie uwierzytelniania do pracy ze wszystkimi domenami (na przykład http://mydomain.com, http://www.mydomain.com i http://sub.mydomain.com)?
Czy możesz wpisać kod, którego używasz podczas logowania użytkownika? Czy używasz tylko wbudowanych funkcji FormsAuthentication, po prostu bez użycia dostawcy? Czy korzystasz z własnego, niestandardowego dostawcy? – sestocker
Podczas pierwszego logowania, jakie wartości są powiązane z plikiem cookie (w szczególności z datą wygaśnięcia)? – sestocker
Oto, jak wygląda ciasteczko: http://i50.tinypic.com/npm26c.png –