2012-06-14 3 views
1

Я пишу веб-приложение ASP.NET MVC3, и аутентификация пользователя не выполняется (пользователь не аутентифицирован), когда я вызываю метод действия с Ajax. Мой вызов выглядит следующим образом:Ошибка аутентификации пользователя ASP.NET MVC при использовании AJAX

$(function() { 
       $("#picture").makeAsyncUploader({ 
        upload_url: '@Url.Action("AsyncUpload", "Profile")', 
        flash_url: '/Scripts/swfupload.swf', 
        button_image_url: '/Scripts/blankButton.png' 
       }); 
      }); 

где makeAsyncUploader функция в отдельном JS файл, который обрабатывает все AJAX вещи. Я пробовал отлаживать приложение, и похоже, что никакие файлы cookie не отправляются мне с запросом. Кто-нибудь знает, в чем проблема?

+0

показать как вашу функцию makeAsyncUploader и действие вашего косиллера AsyncUpload –

+0

Не могли бы вы включить некоторые коды из контроллера? – learning

ответ

2

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

Во флеше для Firefox есть ошибка. Он не отправляет файлы cookie при загрузке файлов. Мое решение:

1) Создать новый атрибут авторизовать

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = true, AllowMultiple = true)] 
    public class FlashAuthorizeAttribute : AuthorizeAttribute 
    { 
     private const string AUTH_TOKEN = "AuthenticationToken4Flash"; 
     protected override bool AuthorizeCore(System.Web.HttpContextBase httpContext) 
     { 
      string authToken = httpContext.Request.Params[AUTH_TOKEN]; 
      if (authToken != null) 
      { 
       FormsAuthenticationTicket authForm = FormsAuthentication.Decrypt(authToken); 
       if (authForm != null) 
       { 
        FormsIdentity formIdentity = new FormsIdentity(authForm); 
        string[] userRoles = System.Web.Security.Roles.GetRolesForUser(formIdentity.Name); 
        GenericPrincipal userPrincipal = new GenericPrincipal(formIdentity, userRoles); 
        httpContext.User = userPrincipal; 
       } 
      } 
      return base.AuthorizeCore(httpContext); 
     } 
    } 

2) Контроллер

[FlashAuthorize] 
    public ActionResult AsyncUpload() 
    { 
     HttpPostedFileBase file = Request.Files[0]; 
    } 

3) Измените JS (FormData, scriptData не работает для меня, так что я добавил строка запроса)

 upload_url: '@Url.Action("AsyncUpload", "Profile")' +'?AuthenticationToken4Flash=' + '@(Request.Cookies[FormsAuthentication.FormsCookieName]==null ? string.Empty : Request.Cookies[FormsAuthentication.FormsCookieName].Value)', 

Я надеюсь, что это поможет кому-то

+0

Только то, что я искал :) – ruffen

+0

Я рад, что смог помочь :) – free4ride

Смежные вопросы