Проблемы с CurrentUserPropertyBinder, он не всегда может запомнить пользователя

Я реализовал CurrentUserPropertyBinder (см. Ниже) для веб-приложения, использующего FubuMVC.

public class CurrentUserPropertyBinder : IPropertyBinder
    {
        private readonly Database _database;
        private readonly ISecurityContext _security;
        public CurrentUserPropertyBinder(Database database, ISecurityContext security)
        {
            _database = database;
            _security = security;
        }
        public bool Matches(PropertyInfo property)
        {
            return property.PropertyType == typeof(User)
                && property.Name == "CurrentUser";
        }
        public void Bind(PropertyInfo property, IBindingContext context)
        {
            var currentUser = //check database passing the username to get further user details using _security.CurrentIdentity.Name
            property.SetValue(context.Object, currentUser, null);
        }
    }

Когда я захожу на свой сайт, это работает нормально. CurrentUserPropertyBinder содержит всю информацию, необходимую для выполнения задачи (то есть в _security.CurrentIdentity.Name указаны правильные данные пользователя)

Когда я пытаюсь импортировать файл с помощью fineUploader ( http://fineuploader.com/), который открывает стандартный файл Dialog, _security.CurrentIdentity.Name пусто.

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

Пожалуйста помоги! Заранее спасибо

ПРИМЕЧАНИЕ. Мы используем FubuMVC.Authentication для аутентификации пользователей.

1 ответ

Решение

Я предполагаю, что ваши действия для этого исключены из аутентификации; возможно, это конечная точка / действие только для AJAX. Не видя, как выглядит это действие, я думаю, что вы можете обойтись без простого исправления, если вы обновили FubuMVC.Authentication за последние 3 месяца или около того.

Для этого действия необходимо включить сквозную аутентификацию. Из коробки FubuMVC.Auth подключает IPrincipal только для действий, требующих аутентификации. Если вы хотите получить доступ к этой информации от других действий, вы должны включить сквозной фильтр. Вот несколько быстрых способов сделать это.

  1. Украсьте класс конечной точки / контроллера, этот конкретный метод действия или модель ввода для этого действия атрибутом [PassThroughAuthentication], чтобы включить сквозную аутентификацию.

    [PassThroughAuthentication]
    public AjaxContinuation post_upload_file(UploadInputModel input) { ... }
    

    или же

    [PassThroughAuthentication]
    public class UploadInputModel { ... }
    
  2. Измените AuthenticationSettings, чтобы он соответствовал вызову действия для сквозного доступа в FubuRegistry во время начальной загрузки.

    ...
    AlterSettings<AuthenticationSettings>(x => {
        // Persistent cookie lasts 3 days ("remember me").
        x.ExpireInMinutes = 4320;
    
        // Many ways to filter here.
        x.PassThroughChains.InputTypeIs<UploadInputModel>();
    });
    

Проверьте /_fubu/endpoints, чтобы убедиться, что в цепочке с вашим действием действует фильтр сквозной передачи или аутентификации.

Другие вопросы по тегам