2011-07-05 16 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 

は、ログインに成功した後でも偽です。

ブラウザクライアントとAirクライアントの使用に違いがあるのはなぜですか?そして私はこれをどのように修正するのですか?

EDIT:もう一つの手がかり:いくつかのより多くのデバッグ文を入れた後、私は空気から電話をかけるときfilterContext.HttpContext.User.Identityが正しく設定されていないことを発見した - Nameプロパティは空白出てきます!セッションIDが正しいです、クッキー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クッキー(またはあなたが名前を付けたもの)が要求に応じて送信されるかどうかによって異なります。 Flash/Airがそのクッキーを(wiresharkまたはその他のネットワークツールで)送信していることを確認してください。

+0

私はASPXAUTHクッキーを送信していますが、認証後に返されているものと同じであることを確認しました。 –

+0

エアリクエストで何か違うものがあります。両方のリクエストをwiresharkで捕捉して比較します。 – Vnuk

+0

私はこれについてShaulと働いています...私たちはCharlesを使用していますが、Cookieには違いはありません(他のパラメータにも違いがあります)。 – davidkomer

0

HttpContext.User.Identityはglobal.asaxのApplication_AuthorizeRequestに表示されますか?

+0

他の場所と同じ動作 - ブラウザから呼び出された場合、yes ;空気から呼び出されたとき、いいえ。 –

関連する問題