1

デフォルトのFormsAuthenticationワークフローが発生しないようにするためにAjaxリクエストに使用しているカスタム属性があります(Ajaxリクエストには意味がないため)。

これはカスタム承認属性です:

public class AjaxAuthorize : AuthorizeAttribute {
    protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext) {
        UrlHelper urlHelper;

        if (filterContext.HttpContext.Request.IsAjaxRequest()) {
            urlHelper = new UrlHelper(filterContext.RequestContext);

            filterContext.HttpContext.Response.StatusCode = 401;
            //Don't let IIS7 be mean.
            filterContext.HttpContext.Response.TrySkipIisCustomErrors = true;
            //Return JSON which tells the client where the login page exists if the user wants to authenticate.
            filterContext.HttpContext.Response.Write(new JavaScriptSerializer().Serialize(
                new {
                    LoginUrl = string.Format("{0}?ReturnURL={1}", FormsAuthentication.LoginUrl, urlHelper.Encode(filterContext.HttpContext.Request.Url.PathAndQuery))
                }
            ));
            filterContext.HttpContext.Response.End();
        } else {
            base.HandleUnauthorizedRequest(filterContext);
        }
    }
}

ActionResultを次のようにカスタム承認属性で装飾しました。

[HttpPut]
[ValidateInput(false)]
[AjaxAuthorize]
public ActionResult Comment(string id, string comment) {
    //stuff happens here.
}

ログインしている場合にのみ存在するユーザーに関する情報にアクセスしようとすると、アクション結果内に例外がスローされます。ただし、認証属性で保護されているため、このコードが実行されている理由がわかりません。アクション。

4

3 に答える 3

1
protected virtual void HandleUnauthorizedRequest(AuthorizationContext filterContext) 
{
    // Returns HTTP 401 - see comment in HttpUnauthorizedResult.cs. 
    filterContext.Result = new HttpUnauthorizedResult();
} 

これは、HandleUnauthorizedRequestのデフォルトの実装です。おそらく、必要なJSONと有効なステータスコードを含むカスタムActionResultを割り当てる必要があります。HTTPコンテキストからの直接処理リクエストオブジェクトが機能するかどうかはわかりません。

于 2012-08-31T18:55:53.227 に答える
1

フォーム認証モジュールがリクエストをインターセプトしないように、HTTP 418を返すことになりました(これをしばらく使用したいと思っていました)。次に、スクリプトでそのステータスコードを探し、それを不正なリクエストとして処理し、適切なリダイレクトを実行します。

于 2012-09-20T19:45:23.740 に答える
0

base.HandleUnauthorizedRequest(filterContext);IFブロック内で呼び出してみてください。または、ELSEブロックを削除して、常に。を呼び出しますbase.HandleUnauthorizedRequest(filterContext);

于 2012-08-31T18:54:15.190 に答える