5

次のような Authorize の背後にいくつかのアクション メソッドがあります。

[AcceptVerbs(HttpVerbs.Post), Authorize]
public ActionResult Create(int siteId, Comment comment) {

私が抱えている問題は、AJAXを介してコメント/作成するリクエストを送信していることです

X-Requested-With=XMLHttpRequest

これは、リクエストを AJAX として識別するのに役立ちます。ユーザーがログインせずに Authorize ウォールに到達すると、次の場所にリダイレクトされます。

/Account/LogOn?ReturnUrl=Comment%2fCreate

これにより、AJAX ワークフローが中断されます。にリダイレクトする必要があります

/Account/LogOn?X-Requested-With=XMLHttpRequest

それを達成する方法はありますか?承認が要求されたときに何が起こるかをより詳細に制御する方法はありますか?

4

4 に答える 4

5

ルイスのコメントのおかげで、私はこの解決策にたどり着くことができました (これは完璧にはほど遠いもので、私自身のコメントとともに投稿されました。修正がある場合は、このフレーズを自由に編集して削除してください)、機能します:

public class AjaxAuthorizeAttribute : AuthorizeAttribute {
    override public void OnAuthorization(AuthorizationContext filterContext) {
        base.OnAuthorization(filterContext);
        // Only do something if we are about to give a HttpUnauthorizedResult and we are in AJAX mode.
        if (filterContext.Result is HttpUnauthorizedResult && filterContext.HttpContext.Request.IsAjaxRequest()) {
            // TODO: fix the URL building:
            // 1- Use some class to build URLs just in case LoginUrl actually has some query already.
            // 2- When leaving Result as a HttpUnauthorizedResult, ASP.Net actually does some nice automatic stuff, like adding a ReturnURL, when hardcodding the URL here, that is lost.
            String url = System.Web.Security.FormsAuthentication.LoginUrl + "?X-Requested-With=XMLHttpRequest";
            filterContext.Result = new RedirectResult(url);
        }
    }
}
于 2009-06-03T21:54:29.020 に答える
3

最近、私はまったく同じ問題に遭遇し、J. Pablo Fernández によって投稿されたコードを使用して、リターン URL を考慮して修正しました。ここにあります:

public class AuthorizeAttribute : System.Web.Mvc.AuthorizeAttribute
{
    override public void OnAuthorization(AuthorizationContext filterContext)
    {
        base.OnAuthorization(filterContext);
        // Only do something if we are about to give a HttpUnauthorizedResult and we are in AJAX mode. 
        if (filterContext.Result is HttpUnauthorizedResult && filterContext.HttpContext.Request.IsAjaxRequest())
        {
            // TODO: fix the URL building: 
            // 1- Use some class to build URLs just in case LoginUrl actually has some query already. 
            HttpRequestBase request = filterContext.HttpContext.Request;
            string returnUrl = request.Path;
            bool queryStringPresent = request.QueryString.Count > 0;
            if (queryStringPresent || request.Form.Count > 0)
                returnUrl += '?' + request.QueryString.ToString();
            if (queryStringPresent)
                returnUrl += '&';
            returnUrl += request.Form;
            String url = System.Web.Security.FormsAuthentication.LoginUrl +
                         "?X-Requested-With=XMLHttpRequest&ReturnUrl=" +
                         HttpUtility.UrlEncode(returnUrl);
            filterContext.Result = new RedirectResult(url);
        }
    }
}
于 2010-07-13T13:38:59.153 に答える
0

これを処理する正しい方法は、Javascript で AJAX 呼び出しを行うことだと思います。

ユーザーが承認される (またはコードが示すように認証される) 必要があり、承認されていない場合は、ユーザーに通知する必要があり、そもそもユーザーがコメントを試みたりコメントしたりできないようにする必要があります。

ただし、それがニーズに合わない場合。独自の承認アクション フィルターを作成してみてください。おそらく、MVC フレームワークに付属しているフィルターを継承して、希望どおりにリダイレクトすることができます。それはかなり簡単です。

于 2009-06-03T16:16:37.430 に答える