IsAuthenticated适用于浏览器 - 但不适用于Air客户端!

时间:2011-07-05 16:55:40

标签: asp.net asp.net-mvc air

我的登录代码,经过身份验证后:

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);

并且,感谢Darin Dimitrov,我有一个自定义授权属性:

[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 / Adob​​e Air客户端,并且身份验证属性导致失败。通过将调试语句放入代码中,我可以说:

filterContext.HttpContext.User.Identity.IsAuthenticated

是假的 - 即使在成功登录后也是如此!

为什么使用浏览器客户端和Air客户端之间有任何区别?我该如何解决这个问题?

编辑:另一条线索:在发出更多调试声明之后,我发现从空中拨打电话时filterContext.HttpContext.User.Identity未正确设置 - Name财产空白!会话ID正确,cookie ID正确 - 但未设置User.Identity。有什么想法可能会发生这种情况吗?

3 个答案:

答案 0 :(得分:4)

也许HttpCookieMode(http://msdn.microsoft.com/en-us/library/system.web.httpcookiemode.aspx)被设置为错误的值?

默认为UseDeviceProfile ...当你强制使用UseCookies时会发生什么?

答案 1 :(得分:2)

这是一个漫长的过程,但IsAuthenticated取决于客户端的ASPXAUTH cookie(或任何你已经命名的id)随请求发送。确保flash / air正在发送该cookie(通过wireshark或任何其他网络工具)

答案 2 :(得分:0)

HttpContext.User.Identity是否出现在global.asax的Application_AuthorizeRequest中?