私のログインコードは、認証後: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/Adobe Airクライアントで作業していますが、認証属性が原因で失敗しています。デバッグステートメントをコードに挿入すると、次のことが分かります。
filterContext.HttpContext.User.Identity.IsAuthenticated
は、ログインに成功した後でも偽です。
ブラウザクライアントとAirクライアントの使用に違いがあるのはなぜですか?そして私はこれをどのように修正するのですか?
EDIT:もう一つの手がかり:いくつかのより多くのデバッグ文を入れた後、私は空気から電話をかけるときfilterContext.HttpContext.User.Identity
が正しく設定されていないことを発見した - Name
プロパティは空白出てきます!セッションIDが正しいです、クッキーIDは正しいですが、User.Identity
が設定されていません。これがなぜ起こっているのでしょうか?
驚くべき - ''の ''タグに 'cookieless =" UseCookies "'を追加しました。あなたは天才です、あなた! :) –
よろしく! G-dに感謝します! ...それはチームの努力 - 偉大な仕事だったShaul!私たちが正しい方向に考えるのを助けてくれてありがとう@vnuk! – davidkomer