programing

asp.net MVC에서 Attribute 및 jquery AJAX 인증

batch 2023. 3. 7. 21:11
반응형

asp.net MVC에서 Attribute 및 jquery AJAX 인증

jquery ajax 함수를 사용하여 폼을 제출했습니다.사용자가 로그인하지 않으면 로그인 페이지로 리다이렉트해야 합니다.Authorize() 속성을 사용하고 있습니다.

[Authorize]
public ActionResult Creat()
{
....
}

사용자가 로그인하지 않은 경우 액션 로그인 페이지를 jquery의 Ajax 함수로 되돌리고 동일한 페이지에 표시되지만 로그인 페이지로 사용자를 리디렉션하고 싶습니다.무슨 방법이 있을까요?

작업 예: https://github.com/ronnieoverby/mvc-ajax-auth

중요 부품:

Ajax Authorize Attribute:

using System.Web.Mvc;

namespace MvcApplication1
{
    public class AjaxAuthorizeAttribute : AuthorizeAttribute
    {
        protected override void HandleUnauthorizedRequest(AuthorizationContext context)
        {
            if (context.HttpContext.Request.IsAjaxRequest())
            {
                var urlHelper = new UrlHelper(context.RequestContext);
                context.HttpContext.Response.StatusCode = 403;
                context.Result = new JsonResult
                {
                    Data = new
                    {
                        Error = "NotAuthorized",
                        LogOnUrl = urlHelper.Action("LogOn", "Account")
                    },
                    JsonRequestBehavior = JsonRequestBehavior.AllowGet
                };
            }
            else
            {
                base.HandleUnauthorizedRequest(context);
            }
        }
    }
}

Javascript:

    $(function () {
        $(document).ajaxError(function (e, xhr) {
            if (xhr.status == 403) {
                var response = $.parseJSON(xhr.responseText);
                window.location = response.LogOnUrl;
            }
        });
    });

컨트롤러의 Atribute를 사용합니다.

    [AjaxAuthorize]
    public ActionResult Secret()
    {
        return PartialView();
    }

Ajax를 실행합니다.

@Ajax.ActionLink("Get Secret", "Secret", new AjaxOptions { UpdateTargetId = "secretArea", })

<div id="secretArea"></div>

#Ronnie의 답변에 간단하게 추가

페이지 URL을 리다이렉트로 유지할 경우.

 var pathname = window.location.pathname;
        if (xhr.status == 403) {
                var response = $.parseJSON(xhr.responseText);
                window.location = response.LogOnUrl + '?ReturnUrl=' + pathname;
            }

로니 오버비의 대답의 또 다른 연장선상에서요

그의 솔루션은 webapi에서는 동작하지 않지만 일반 Authorize 속성을 대신 사용하여 다음과 같이 ajaxError 함수의 401 상태를 처리할 수 있기 때문에 괜찮습니다.

    $(document).ajaxError(function (e, xhr) {
    //ajax error event handler that looks for either a 401 (regular authorized) or 403 (AjaxAuthorized custom actionfilter). 
    if (xhr.status == 403 ||xhr.status == 401) {
       //code here
    }
});

언급URL : https://stackoverflow.com/questions/5258721/authorize-attribute-and-jquery-ajax-in-asp-net-mvc

반응형