Проблемы с 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 только для действий, требующих аутентификации. Если вы хотите получить доступ к этой информации от других действий, вы должны включить сквозной фильтр. Вот несколько быстрых способов сделать это.
Украсьте класс конечной точки / контроллера, этот конкретный метод действия или модель ввода для этого действия атрибутом [PassThroughAuthentication], чтобы включить сквозную аутентификацию.
[PassThroughAuthentication] public AjaxContinuation post_upload_file(UploadInputModel input) { ... }
или же
[PassThroughAuthentication] public class UploadInputModel { ... }
Измените 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, чтобы убедиться, что в цепочке с вашим действием действует фильтр сквозной передачи или аутентификации.