사용자가 인증되지 않은 경우 Ajax 요청을 어떻게 처리합니까?
사용자가 인증되지 않은 경우 Ajax 요청을 어떻게 처리합니까?
페이지에 한 를 비우고 jQuery를 사용하여 합니다.$.post
결과페이지로 )를 인증되지 않았으므로 메서드는 RedirectToRoute 결과(로그인 페이지로 리디렉션)를 반환합니다.그걸로 뭘 합니까?클라이언트 측에서는 어떻게 처리하고 컨트롤러에서는 어떻게 처리합니까?
편집:
오래전에 위 답변을 썼는데 지금은 403을 보내는 것이 적절한 방법이 아니라고 생각합니다. 403은 약간 다른 의미를 가지고 있어서 그냥 사용해서는 안 됩니다.이 속성은 401을 사용하여 수정됩니다.추가 항목과만 다릅니다.context.HttpContext.Response.End()
Http401 결과 및 다른 HTTP 코드에서:
public class OptionalAuthorizeAttribute : AuthorizeAttribute
{
private class Http401Result : ActionResult
{
public override void ExecuteResult(ControllerContext context)
{
// Set the response code to 401.
context.HttpContext.Response.StatusCode = 401;
context.HttpContext.Response.Write(CTRes.AuthorizationLostPleaseLogOutAndLogInAgainToContinue);
context.HttpContext.Response.End();
}
}
private readonly bool _authorize;
public OptionalAuthorizeAttribute()
{
_authorize = true;
}
//OptionalAuthorize is turned on on base controller class, so it has to be turned off on some controller.
//That is why parameter is introduced.
public OptionalAuthorizeAttribute(bool authorize)
{
_authorize = authorize;
}
protected override bool AuthorizeCore(HttpContextBase httpContext)
{
//When authorize parameter is set to false, not authorization should be performed.
if (!_authorize)
return true;
var result = base.AuthorizeCore(httpContext);
return result;
}
protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
{
if (filterContext.RequestContext.HttpContext.Request.IsAjaxRequest())
{
//Ajax request doesn't return to login page, it just returns 401 error.
filterContext.Result = new Http401Result();
}
else
base.HandleUnauthorizedRequest(filterContext);
}
}
이전 답변:
저는 다른 답변에 게시된 아이디어를 좋아하지만(앞서 아이디어를 얻었지만) 코드 샘플이 필요했습니다.다음과 같습니다.
수정된 인증 특성:
public class OptionalAuthorizeAttribute : AuthorizeAttribute
{
private class Http403Result : ActionResult
{
public override void ExecuteResult(ControllerContext context)
{
// Set the response code to 403.
context.HttpContext.Response.StatusCode = 403;
context.HttpContext.Response.Write(CTRes.AuthorizationLostPleaseLogOutAndLogInAgainToContinue);
}
}
private readonly bool _authorize;
public OptionalAuthorizeAttribute()
{
_authorize = true;
}
//OptionalAuthorize is turned on on base controller class, so it has to be turned off on some controller.
//That is why parameter is introduced.
public OptionalAuthorizeAttribute(bool authorize)
{
_authorize = authorize;
}
protected override bool AuthorizeCore(HttpContextBase httpContext)
{
//When authorize parameter is set to false, not authorization should be performed.
if (!_authorize)
return true;
var result = base.AuthorizeCore(httpContext);
return result;
}
protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
{
if (filterContext.RequestContext.HttpContext.Request.IsAjaxRequest())
{
//Ajax request doesn't return to login page, it just returns 403 error.
filterContext.Result = new Http403Result();
}
else
base.HandleUnauthorizedRequest(filterContext);
}
}
HandleUnauthorizedRequest
되므로 "으"를 합니다.Http403Result
Ajax를 사용할 때.Http403Result
StatusCode를 403으로 변경하고 응답하는 사용자에게 메시지를 반환합니다.▁in)authorize
매개 변수), 사용자가 설정하기 때문입니다.[Authorize]
기본 컨트롤러에서 실행 중지하고 일부 페이지에서 실행 중지할 수 있습니다.
또 다른 중요한 부분은 클라이언트 측에서 이 응답을 글로벌하게 처리하는 것입니다.이것이 제가 사이트에 배치한 것입니다.마스터:
<script type="text/javascript">
$(document).ready(
function() {
$("body").ajaxError(
function(e,request) {
if (request.status == 403) {
alert(request.responseText);
window.location = '/Logout';
}
}
);
}
);
</script>
를 배치하고 GLOBAL Ajax 오류 처리기를 합니다.$.post
403 오류와 함께 실패하고 응답 메시지가 경고되고 사용자가 로그아웃 페이지로 리디렉션됩니다.는 모든 오류를 처리할 필요가 .$.post
전체적으로 처리되기 때문에 요청합니다.
401이 아닌 403이 MVC 프레임워크에 의해 내부적으로 처리되는 이유는 무엇입니까? 401은 인증 실패 후 로그인 페이지로 리디렉션됩니다.
당신은 그것에 대해 어떻게 생각합니까?
동료가 처리 방법에 대해 물었을 때 제가 생각해 낸 아이디어는 AuthorizeAjax 속성을 만드는 것입니다.요청을 조회하고 확인할 수 있습니다.IsAjaxRequest()이며 요청이 인증되지 않은 경우 특정 JSON 오류 개체를 반환합니다.승인되지 않은 AJAX 요청이 아닌 경우 기본 AuthorizeAttribute를 재정의하여 기본적으로 호출하도록 하면 컨트롤러 작업에 [Ajax 인증] 또는 [Ajax 인증] 태그를 지정할 필요가 없습니다.
클라이언트 측에서는 반환된 오류를 처리할 수 있도록 모든 페이지를 준비해야 하지만 이러한 논리는 공유될 수 있습니다.
독자적인 AuthorizeAttribute를 생성하고 요청이 Ajax 요청이면 HttpException(401/403)을 생성할 것을 제안합니다.또한 jQuery의 Ajax Method를 대신 사용하도록 전환합니다.
오류 페이지를 구현하고 올바른 상태 코드를 반환한다고 가정하면,error
콜백이 대신 실행됩니다.success
콜백이것은 응답 코드 때문에 발생할 것입니다.
이에 대한 가장 간단하고 깨끗한 솔루션은 jQuery.ajaxSuccess() 이벤트에 콜백을 등록하고 "X-AspNetMvc-Version" 응답 헤더를 확인하는 것입니다.
내 앱의 모든 jQuery Ajax 요청은 Mvc에서 처리되므로 헤더가 없으면 로그인 페이지로 요청이 리디렉션되었음을 알고 최상위 리디렉션을 위해 페이지를 다시 로드합니다.
$(document).ajaxSuccess(function(event, XMLHttpRequest, ajaxOptions) {
// if request returns non MVC page reload because this means the user
// session has expired
var mvcHeaderName = "X-AspNetMvc-Version";
var mvcHeaderValue = XMLHttpRequest.getResponseHeader(mvcHeaderName);
if (!mvcHeaderValue) {
location.reload();
}
});
페이지를 다시 로드하면 일부 Javascript 오류가 발생할 수 있지만(Ajax 응답으로 수행하는 작업에 따라 다름) 디버깅이 해제된 경우 대부분의 경우 사용자는 이러한 오류를 볼 수 없습니다.
기본 제공 헤더를 사용하지 않으려면 사용자 지정 헤더를 쉽게 추가하고 동일한 패턴을 따를 수 있습니다.
여기 제가 사용하는 해결책이 있습니다.그것은 아주 간단합니다, 조금 폭력적이긴 하지만.저는 제가 게으르고 액션 방법에 대한 특별한 속성을 생각하고 싶지 않기 때문에 좋아하고, 필요하지 않다면 Ajax 오류 처리기를 쓰고 싶지 않습니다(클라이언트 스크립트가 403 상태 코드를 감지하고 사용자 친화적인 작업을 할 수 없었던 이유는 없지만).
Global(글로벌)에 저장합니다.axax는 인증되지 않은 모든 ajax 요청을 감지하고 콘텐츠 없이 403만 반환합니다.이렇게 하면 양식 인증이 사용 중일 때 인증되지 않은 Ajax 호출이 로그인 양식으로 리디렉션되는 것을 방지할 수 있습니다.
protected void Application_AuthenticateRequest(object sender, EventArgs e)
{
// Prevent Ajax requests from being returned the login form when not authenticated
// (eg. after authentication timeout).
if ((Request.Headers["X-Requested-With"] != null && Request.Headers["X-Requested-With"] == "XMLHttpRequest")
||
(Request["X-Requested-With"] != null && Request["X-Requested-With"] == "XMLHttpRequest"))
{
if (!Request.IsAuthenticated)
{
Response.Clear();
Response.StatusCode = 403;
Response.Flush();
Response.End();
}
}
}
Ajax 요청을 감지하여 401을 보낼 수 있으며, 클라이언트 측에서는 로그인 프롬프트와 함께 Ajax 대화 상자를 표시할 수도 있습니다. 그러면 실패한 Ajax 요청을 "계속"하여 애플리케이션이 작동하고 사용자가 세션 시간 초과가 발생하지 않은 것처럼 느낄 수 있습니다.자세한 내용은 이 답변을 참조하십시오.
언급URL : https://stackoverflow.com/questions/2580596/how-do-you-handle-ajax-requests-when-user-is-not-authenticated
'programing' 카테고리의 다른 글
데이터베이스 테이블을 만들 때 Zoomla! 3 설치가 중지됩니다. (0) | 2023.07.30 |
---|---|
Oracle Forms에서 PL/SQL 부울 변수 평가 (0) | 2023.07.30 |
Spring Boot : 속성이 .properties 파일에 있음에도 불구하고 Spring은 항상 속성에 기본값을 할당합니다. (0) | 2023.07.30 |
웹 응용 프로그램의 SMS (0) | 2023.07.30 |
mariadb 덤프를 가져올 수 없습니다. (0) | 2023.07.30 |