ASP.NET Cookie аутентификации MVC, не получаемый

Мне нелегко реализовывать, "Помнят Меня" функциональность в приложении MVC с пользовательским принципалом. Я свел его к ASP.NET, не получающему cookie аутентификации для меня. Я включал снимок ниже от Google Chrome.

  1. Показывает результаты Запроса. Cookie, который установлен в рамках действия контроллера и помещен в ViewData для представления для чтения. Заметьте, что это пропускает.ASPXAUTH cookie

  2. Показывает результаты инструментов разработчика Chrome. Вы видите, что.ASPXAUTH включен здесь.

alt text

Какова может быть проблема здесь? Почему 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)?

8
задан Glorfindel 28 July 2019 в 23:03
поделиться

3 ответа

Вы тоже это проверяли?

Файл cookie ASPXAUTH не сохраняется

Я не уверен, что это может быть причиной того, что файл cookie отображается в Chrome, но не передается в браузер, или это может помешать сохранению файла cookie, но также стоит взгляд.

1
ответ дан 6 December 2019 в 00:54
поделиться

Если вы пытаетесь сохранить фактический объект User в самом файле cookie, он, вероятно, слишком велик для сохранения в качестве файла cookie. Я не слишком знаком с аутентификацией MVC, но в веб-формах я обычно делаю следующее:

FormsAuthentication.RedirectFromLoginPage(user_unique_id_here, false);

Второй параметр - постоянство, которое вы ищете.

Оттуда я создаю настраиваемый контекст (UserContext), который заполняю через HttpModule, который дает мне доступ ко всей информации о пользователях и ролях.

Поскольку я не занимаюсь разработкой в ​​MVC (пока) или CSLA, я не уверен, насколько еще я могу помочь. На вашем месте я бы также отказался от индивидуального поставщика членства. С таким же успехом вы можете просто вызвать MoralePrincipal.Login прямо в вашем контроллере аутентификации.

1
ответ дан 6 December 2019 в 00:54
поделиться

ЗапоминаниеMe должно быть установлено с помощью FormsAuthenticationService (в MVC2) или статическим классом FormsAuthentication в MVC1, если вы используете «обычный» код AccountController. Если вы изменили этот код, не забыли ли вы добавить (необязательный) логический параметр, указывающий, следует ли использовать постоянный файл cookie или нет?

Мне кажется, вы получаете файл cookie сеанса, но не постоянный файл cookie.

1
ответ дан 6 December 2019 в 00:54
поделиться
Другие вопросы по тегам:

Похожие вопросы: