>source

내 ASP.NET Core WebAPI 애플리케이션에서 사용자 지정 인증 미들웨어를 사용하여 요청을 인증했습니다. 모든 것이 잘 작동하지만 실패 이유가 응답 개체에서 사용자에게 어떻게 전송되는지 알 수 없습니다.

protected override  Task<AuthenticateResult> HandleAuthenticateAsync()
    {
    var token= headers["Authorization"].ToString();
                if (string.IsNullOrEmpty(token))
                {
    return  Task.FromResult(AuthenticateResult.Fail("Token is null"));
    }
}

다음을 시도했습니다.

Task callTask= Task.Run(
                    async ()=> await Context.Response.WriteAsync(errorResult).ConfigureAwait(false));
                if (callTask.IsCompletedSuccessfully)
                {
                    callTask.Wait();
                }

그러나 피들러에서 504 상태 code를 얻는 중

[Fiddler] ReadResponse() 실패: 서버가 이 요청에 대한 완전한 응답을 반환하지 않았습니다. 서버가 379바이트를 반환했습니다.

이 실패 이유 "Token is null"이 응답으로 전송되는 방식입니다.

피들러는 서버가 무엇을 반환했다고 말했습니까(원시 헤더 및 본문)?

Caramiriel2022-02-07 12:49:26

HTTP/1.1 504 피들러 -수신 실패 콘텐츠 유형: text/html; 연결: 닫기 [Fiddler] ReadResponse() 실패: 서버가 이 요청에 대한 완전한 응답을 반환하지 않았습니다. 서버가 379바이트를 반환했습니다.

Gautam Sharma2022-02-07 12:49:26
  • 답변 # 1

    무단 응답 본문을 사용자 정의하기 위해 미들웨어를 사용할 수 있습니다. 당신은 그것을 사이에 넣어사용자 라우팅그리고사용 인증*Startup.cs의 호출

    //Your Configure method in Startup.cs
    app.UseRouting();
    app.Use(async (context, next)=>{
        await next();
        if (context.Response.StatusCode== (int) HttpStatusCode.Unauthorized)
        {
            context.Response.ContentType= "text/plain";
            await context.Response.WriteAsync("some custom message");
        }
    });
    app.UseAuthentication();
    app.UseAuthorization();
    

    미들웨어는 다음 핸들러에 요청을 전달하고, 대기한 다음 응답 code를 확인하고 401이면 응답 본문을 수정합니다. 응답 콘텐츠 유형 설정을 잊지 마세요. 여기에서 중요합니다.

    기본적으로 여기에 모든 논리를 배치할 수 있습니다. 예를 들어 인증 처리기에서 승인되지 않은 이유로 사용자 지정 응답 헤더를 설정할 수 있습니다.

    Response.Headers.Add("X-Custom-Unathorized-Reason", "...");
    

    미들웨어에서 이 메시지에 액세스합니다.

    var reason= context.Response.Headers["X-Custom-Unathorized-Reason"];
    context.Response.ContentType= "text/plain";
    await context.Response.WriteAsync(reason);
    

    IAuthorizationMiddlewareResultHandler를 통해 이를 수행하는 현대적인 방법도 있습니다. 그러나 .NET 5/6에서만 작동합니다.

    Pavel Kirilin2022-02-07 15:53:11
  • 이전 javascript : 객체는 생성자에서 이것을 할당합니다.
  • 다음 html : 로그인 양식 텍스트 상자가 사라지지 않음