0

認可フィルターを作成しました

public class LandedAttribute : AuthorizeAttribute
{
   protected override bool AuthorizeCore(HttpContextBase httpContext) {
      if (httpContext == null)
         throw new ArgumentNullException("httpContext");
      if (HttpContext.Current.Response.Cookies["LegalDisclaimer"].Value != "Accepted")
      {
         return false;
      }
      return true;
}
protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext){
   string url = filterContext.HttpContext.Request.Url.ToString();
   System.Diagnostics.Debug.WriteLine(url);
   filterContext.Result = new RedirectToRouteResult(
   new RouteValueDictionary {
     { "action", "Index" },
     { "controller", "Landing" },
     { "returnUrl", url }
   });
}

}

と私の着陸管制官

public ActionResult Index(string returnUrl)
        {
            ViewBag.rdParm = returnUrl;
            return View();
        }
        public ActionResult Accept(string returnUrl)
        {
            HttpCookie cookie = new HttpCookie("LegalDisclaimer", "Accepted");
            Response.Cookies.Add(cookie);
            if (Url.IsLocalUrl(returnUrl))
            {
                return Redirect(returnUrl);
            }
            else
            {
                return RedirectToAction("Index", "Home");
            }
        }

次に、次のようなコントローラーをセットアップします

[Landed] 
public class someController : Controller
{
contoller actions here
}

問題は、LegalDisclaimer Cookie が設定されず、常に null を返すことです。これは、mvc で Authorize フィルターを学習する最初の試みであり、その 3 日間は何の進歩もありません。誰でもこれをデバッグするのを手伝ってくれますか?

4

1 に答える 1

1

これは無視してください - 以下の更新を参照してください

Cookie を設定できないようです。あなたの Accept アクションはLandingController、Cookie を設定する唯一のものだと思います。ただし、作成したカスタム Authorize フィルター ( LandedAttribute) がアプリケーションのアクセスを停止するため (Cookie が設定されていないため)、そこに到達することはできません。

おそらく[AllowAnonymous]、そのアクションに を追加して、Cookie を設定できるようにする必要があります。

例えば

[AllowAnonymous]
public ActionResult Accept()
{
    // body of the action here.
}

アップデート

LandedAttribute受信 Cookie ではなく、送信 Cookie を読み取ろうとしていることに気付きました。

あなたが持っていHttpContext.Current.Responseます。Requestではなく でCookie を使用します。Response

送信 Cookie をそこに設定しているため、Controller アクションは引き続き Response を使用する必要があります。

于 2013-08-24T11:46:50.850 に答える