2011-07-05 63 views
5

我的登录密码,验证后:IsAuthenticated适用于浏览器 - 但不适用于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 

即使在登录成功后也是false!

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

编辑:另一条线索:投入多一些调试语句后,我发现,filterContext.HttpContext.User.Identity未正确设置使得从空气中呼叫时 - 在Name财产出来空白!会话ID正确,Cookie ID正确 - 但未设置User.Identity。任何想法,为什么这可能会发生?

回答

4

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

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

+0

令人惊叹 - 我在''中为''标记添加了'cookieless ='UseCookies'',现在它可以工作!你是天才,你! :) –

+0

耶!感谢G-D! ......这是一个团队的努力 - 伟大的工作Shaul!谢谢@vnuk帮助我们朝着正确的方向思考! – davidkomer

2

这是一个很长的,但IsAuthenticated取决于客户端的ASPXAUTH cookie(或任何你命名的id)与请求一起发送。确保闪存/空气正在发送该cookie(通过wireshark或任何其他网络工具)

+0

是的,好的想法,但我发送了ASPXAUTH cookie,检查它与认证后返回的内容相同... –

+0

空中请求中必须有不同的内容。用wireshark捕获这两个请求并进行比较。 – Vnuk

+0

我正在与Shaul一起工作......我们使用Charles,并且Cookies没有差异(虽然在其他参数上有差异) – davidkomer

0

HttpContext.User.Identity是否显示在Global.asax的Application_AuthorizeRequest中?

+0

与其他地方相同的行为 - 从浏览器调用时,是;当从Air呼叫时,没有。 –

相关问题