IsAuthenticated работает в браузере, но не с клиентом Air! - PullRequest
5 голосов
/ 05 июля 2011

Мой логин, после аутентификации:

var authTicket = new FormsAuthenticationTicket(
                1,
                userName,
                DateTime.Now,
                DateTime.Now.AddMinutes(20), // expiry
                false,
                roles,
                "/");
var cookie = new HttpCookie(FormsAuthentication.FormsCookieName, FormsAuthentication.Encrypt(authTicket));
Response.Cookies.Add(cookie);

и, благодаря Дарин Димитров , у меня есть собственный атрибут авторизации:

[AttributeUsage(AttributeTargets.Method | AttributeTargets.Class, Inherited = true, AllowMultiple = true)]
public class TJAuthorize : AuthorizeAttribute {
    public override void OnAuthorization(AuthorizationContext filterContext) {
        string cookieName = FormsAuthentication.FormsCookieName;

        if (!filterContext.HttpContext.User.Identity.IsAuthenticated ||
                filterContext.HttpContext.Request.Cookies == null || filterContext.HttpContext.Request.Cookies[cookieName] == null) {
                    HandleUnauthorizedRequest(filterContext);
            return;
        }

        var authCookie = filterContext.HttpContext.Request.Cookies[cookieName];
        var authTicket = FormsAuthentication.Decrypt(authCookie.Value);
        string[] roles = authTicket.UserData.Split(',');

        var userIdentity = new GenericIdentity(authTicket.Name);
        var userPrincipal = new GenericPrincipal(userIdentity, roles);

        filterContext.HttpContext.User = userPrincipal;
        base.OnAuthorization(filterContext);
    }

Все это прекрасно работает, когда я работаю в сеансе браузера. Но сейчас я работаю с клиентом Flash / Adobe Air, и атрибут аутентификации вызывает сбой. Поместив в код операторы отладки, я могу сказать, что:

filterContext.HttpContext.User.Identity.IsAuthenticated

неверно - даже после успешного входа!

Почему должна существовать разница между использованием клиента браузера и клиента Air? И как мне это исправить?

РЕДАКТИРОВАТЬ: Еще одна подсказка: после добавления еще нескольких отладочных операторов, я обнаружил, что filterContext.HttpContext.User.Identity не правильно установлен при выполнении вызова из воздуха - свойство Name выходит пустым! Идентификатор сеанса правильный, идентификатор cookie правильный, но User.Identity не задано. Есть идеи, почему это может происходить?

Ответы [ 3 ]

4 голосов
/ 06 июля 2011

Возможно, для HttpCookieMode (http://msdn.microsoft.com/en-us/library/system.web.httpcookiemode.aspx) задано неверное значение?

По умолчанию используется UseDeviceProfile ... что происходит, когда вы принудительно используете UseCookies?

2 голосов
/ 05 июля 2011

Это длинный снимок, но IsAuthenticated зависит от клиентского файла cookie ASPXAUTH (или от того, что вы назвали идентификатором), отправляемого с запросом. Убедитесь, что flash / air отправляет этот cookie (с помощью wireshark или любого другого сетевого инструмента)

0 голосов
/ 06 июля 2011

HttpContext.User.Identity отображается в Application_AuthorizeRequest в global.asax?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...