Uploadify (флэш-загрузка файлов) и встроенная проверка подлинности Windows - PullRequest
5 голосов
/ 31 марта 2010

У меня проблема с Uploadify, и я надеюсь, что кто-то может помочь. Я поместил Uploadify в свое приложение и все отлично работает в dev (используя веб-сервер VS). Все работало нормально и проверялось, пока я не развернул приложение в своей тестовой среде, в которой используется встроенная проверка подлинности Windows.

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

Когда это начало происходить, я решил раскрутить Фиддлера и посмотреть, что происходит. Но угадайте, что когда работает Fiddler, проблема не возникает.

К сожалению, я не могу сделать запуск Fiddler удобным для запуска приложения. Следовательно, у кого-нибудь есть идеи. Я знаю, что есть некоторые проблемы с Uploadify / flash при использовании проверки подлинности с помощью форм, но я не думаю, что они переносятся на встроенную проверку подлинности Windows.

1 Ответ

2 голосов
/ 19 ноября 2010

Я увидел эту страницу и почти сдался, но затем наткнулся на эту статью от Крейга в PluralSight.Это дало мне идею вернуть 401 из ASP.Net вместо IIS, поэтому в IIS включена анонимная проверка подлинности.

Вот шаги, чтобы обойти эту проблему.

Шаг 1:Включите анонимную аутентификацию и аутентификацию Windows в IIS.

Шаг 2: Добавьте этот код в свой Global.asax.cs
Кредит / Спасибо: Uploadify (сеанс и аутентификация) с ASP.NET MVC
Примечание: В моей версии только запросы POST используют специальную логику, поскольку я хочу, чтобы этот код работал только для загрузки.Другими словами, я удаляю код для запросов GET.Посмотрите на ссылку выше, если вы хотите поддержать GET.

protected void Application_BeginRequest(object sender, EventArgs e)
{
    /* we guess at this point session is not already retrieved by application so we recreate cookie with the session id... */
    try
    {
        string session_param_name = "ASPSESSID";
        string session_cookie_name = "ASP.NET_SessionId";

        if (HttpContext.Current.Request.Form[session_param_name] != null)
        {
            UpdateCookie(session_cookie_name, HttpContext.Current.Request.Form[session_param_name]);
        }

    }
    catch
    {
    }

    try
    {
        string auth_param_name = "AUTHID";
        string auth_cookie_name = FormsAuthentication.FormsCookieName;

        if (HttpContext.Current.Request.Form[auth_param_name] != null)
        {
            UpdateCookie(auth_cookie_name, HttpContext.Current.Request.Form[auth_param_name]);
            return; // this is an uploadify request....get out of here.
        }

    }
    catch
    {
    }

    // handle the windows authentication while keeping anonymous turned on in IIS.
    // see: /1857053/uploadify-flesh-zagruzka-failov-i-vstroennaya-proverka-podlinnosti-windows

    if (Request.ServerVariables["LOGON_USER"].Length == 0) // They haven't provided credentials yet
    {
        Response.StatusCode = 401;
        Response.StatusDescription = "Unauthorized";
        Response.End();
        return;
    }

    FormsAuthentication.SetAuthCookie(Request.ServerVariables["LOGON_USER"], true); 

}

private void UpdateCookie(string cookie_name, string cookie_value)
{
    HttpCookie cookie = HttpContext.Current.Request.Cookies.Get(cookie_name);
    if (null == cookie)
    {
        cookie = new HttpCookie(cookie_name);
    }
    cookie.Value = cookie_value;
    HttpContext.Current.Request.Cookies.Set(cookie);
} 

Шаг 3: Обновите javascript, вызывающий uploadify, для включения ключа авторизации формы и сеансового ключа.

<script> 
    var auth = "<% = Request.Cookies[FormsAuthentication.FormsCookieName]==null ? string.Empty : Request.Cookies[FormsAuthentication.FormsCookieName].Value %>"; 
    var ASPSESSID = "<%= Session.SessionID %>"; 

    $("#uploadifyLogo").uploadify({ 
        ... 
        scriptData: { ASPSESSID: ASPSESSID, AUTHID: auth } 
    }); 

Шаг 4: Обновите ваш web.config

  <system.web>
    ...
    <authentication mode="Forms">
      <forms defaultUrl="/" />
    </authentication>
    ...
...