5 Stimmen

IsAuthenticated funktioniert im Browser - aber nicht mit dem Air-Client!

Mein Anmeldecode, nach der Authentifizierung:

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

und, dank der Darin Dimitrow Ich habe ein benutzerdefiniertes Attribut Authorize:

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

Das alles funktioniert wunderbar, wenn ich in einer Browser-Sitzung arbeite. Aber jetzt arbeite ich mit einem Flash/Adobe Air-Client, und das Authentifizierungsattribut verursacht einen Fehler. Indem ich Debug-Anweisungen in den Code einfüge, kann ich das feststellen:

filterContext.HttpContext.User.Identity.IsAuthenticated

ist falsch - auch nach einer erfolgreichen Anmeldung!

Warum sollte es einen Unterschied zwischen der Verwendung eines Browser-Clients und eines Air-Clients geben? Und wie kann ich das beheben?

EDITAR: Ein weiterer Hinweis: Nachdem ich einige weitere Debug-Anweisungen eingegeben habe, habe ich festgestellt, dass die filterContext.HttpContext.User.Identity nicht korrekt eingestellt ist, wenn Sie den Anruf aus der Luft tätigen - die Name Eigentum geht leer aus! Die Sitzungs-ID ist korrekt, die Cookie-ID ist korrekt - aber die User.Identity nicht gesetzt ist. Haben Sie eine Idee, warum dies der Fall sein könnte?

4voto

davidkomer Punkte 2902

Vielleicht ist HttpCookieMode (http://msdn.microsoft.com/en-us/library/system.web.httpcookiemode.aspx) auf den falschen Wert eingestellt?

Standard ist UseDeviceProfile ... was passiert, wenn Sie UseCookies erzwingen?

2voto

Vnuk Punkte 2615

Es ist weit hergeholt, aber IsAuthenticated hängt davon ab, dass das ASPXAUTH-Cookie des Clients (oder wie auch immer Sie id genannt haben) mit der Anfrage gesendet wird. Stellen Sie sicher, dass Flash/Air dieses Cookie sendet (mit Wireshark oder einem anderen Netzwerk-Tool)

0voto

davidkomer Punkte 2902

Zeigt die HttpContext.User.Identity in der Application_AuthorizeRequest in global.asax auf?

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X