Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net IsAuthenticated可在浏览器上使用,但不能在Air客户端上使用!_Asp.net_Asp.net Mvc_Air - Fatal编程技术网

Asp.net IsAuthenticated可在浏览器上使用,但不能在Air客户端上使用!

Asp.net IsAuthenticated可在浏览器上使用,但不能在Air客户端上使用!,asp.net,asp.net-mvc,air,Asp.net,Asp.net Mvc,Air,身份验证后的我的登录代码: var authTicket = new FormsAuthenticationTicket( 1, userName, DateTime.Now, DateTime.Now.AddMinutes(20), // expiry false, roles,

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

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/AdobeAIR客户端,身份验证属性导致了失败。通过将调试语句放入代码中,我可以看出:

filterContext.HttpContext.User.Identity.IsAuthenticated
为false-即使在成功登录之后

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


编辑:另一个线索:在输入了更多的调试语句后,我发现当从空中进行调用时,
filterContext.HttpContext.User.Identity
没有正确设置-
Name
属性为空!会话ID正确,cookie ID正确-但未设置
用户身份。知道为什么会发生这种情况吗?

这是一个很长的问题,但是否进行身份验证取决于随请求一起发送的客户端的ASPXAUTH cookie(或任何您命名的id)。确保flash/air正在发送cookie(通过wireshark或任何其他网络工具)

在global.asax的应用程序请求中是否显示了HttpContext.User.Identity?

可能是HttpCookieMode(http://msdn.microsoft.com/en-us/library/system.web.httpcookiemode.aspx)是否设置为错误的值


默认为UseDeviceProfile。。。当您强制它使用cookies时会发生什么情况?

是的,好主意,但我正在发送ASPXAUTH cookie,已检查它是否与身份验证后返回的内容相同…air请求中一定有不同的内容。用wireshark捕获这两个请求并进行比较。我正在与Shaul合作。。。我们使用的是Charles,cookie中没有任何差异(尽管其他参数也有差异),看看上面发布的代码,任何其他的cookie问题都没有意义,至少对我来说是这样。在每个请求上,aspnet都必须对请求进行身份验证,并且只能通过身份验证cookie来完成。这确实令人费解。显然,aspnet在授权方面有问题,但如果发送了会话和身份验证cookie,我就不知道还有什么其他问题。当你非常绝望的时候,下载.net调试符号并单步执行aspnet代码。和其他地方一样的行为-当从浏览器调用时,是的;当从空中呼叫时,不。惊人-我在
中的
标记中添加了
cookieless=“UseCookies”
,现在它可以工作了!你这个天才,你!:)耶!!谢谢G-d。。。这是一个团队的努力-伟大的工作Shaul!感谢@vnuk帮助我们朝着正确的方向思考!