Флэш-загрузчик asp.net mvc 3 игнорирует cookie (альтернатива?) - PullRequest
1 голос
/ 18 ноября 2011

Я использую Flash Uploader на сайте, который я создал. Мне нужно загрузить большие файлы на сервер. Проблема в том, что этот загрузчик использует flash. Когда он передает данные, куки не отправляются обратно на сервер, поэтому я не могу проверить пользователя, и это не удастся. Есть ли способ принудительно отправить куки обратно на сервер? И если это невозможно, есть ли другой способ загрузить данные с другим компонентом, который отправляет файлы cookie.

1 Ответ

0 голосов
/ 18 ноября 2011

Есть несколько сайтов, где обсуждается эта проблема.Решение состоит в том, чтобы вручную передать информацию об авторизации обратно в MVC, используя другую переменную post во флэш-памяти.Реализация, которую я нашел, это TokenizedAuthorizeAttribute.

/// <summary>
/// A custom version of the <see cref="AuthorizeAttribute"/> that supports working
/// around a cookie/session bug in Flash.  
/// </summary>
/// <remarks>
/// Details of the bug and workaround can be found on this blog:
/// http://geekswithblogs.net/apopovsky/archive/2009/05/06/working-around-flash-cookie-bug-in-asp.net-mvc.aspx
/// </remarks>
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = true, AllowMultiple = true)]
public class TokenizedAuthorizeAttribute : AuthorizeAttribute
{
    /// <summary>
    /// The key to the authentication token that should be submitted somewhere in the request.
    /// </summary>
    private const string TOKEN_KEY = "AuthenticationToken";

    /// <summary>
    /// This changes the behavior of AuthorizeCore so that it will only authorize
    /// users if a valid token is submitted with the request.
    /// </summary>
    /// <param name="httpContext"></param>
    /// <returns></returns>
    protected override bool AuthorizeCore(System.Web.HttpContextBase httpContext)
    {
        string token = httpContext.Request.Params[TOKEN_KEY];

        if (token != null)
        {
            FormsAuthenticationTicket ticket = FormsAuthentication.Decrypt(token);

            if (ticket != null)
            {
                FormsIdentity identity = new FormsIdentity(ticket);
                string[] roles = System.Web.Security.Roles.GetRolesForUser(identity.Name);
                GenericPrincipal principal = new GenericPrincipal(identity, roles);
                httpContext.User = principal;
            }
        }

        return base.AuthorizeCore(httpContext);
    }
}

. Следуя ссылке 1006 * в комментарии, вы сможете помочь в дальнейшем.

...