안녕하세요. 다시 질문 드립니다ㅠ

저번 답변 달아주셔서 감사합니다.
감사하다는 인사도 못드렸었네요…

아 그리고 곧 새해 복 많이들 받으세요!!

기존 프로젝트에 docker로 사용된 부분이 있어서 사용해보고 log도 찍어보았지만 아직 해결을 하지 못해서 다시 한번 문의듣립니다.

현재 dotnet API 테스트는 postman으로 테스트 진행하고 있으며,
문제되고 있는 소스 부분입니다.

찾아보니 인증에 관련된 부분이던데

string authToken = _authService.GetAuthToken(ctx.Request);

이 부분에서 null값이 나타나기에 문제가 나타나는것으로 확인됩니다.

아래 내용은 configure 전체 내용입니다.

public void Configure(
    IApplicationBuilder app,
    IWebHostEnvironment env,
    IAuthenticationService authenticationService,
    hairdressing_project_dbContext dbContext
    )
{
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();

    }
    else
    {
        app.UseExceptionHandler("/error");

        // app.UseHsts();
    }

    // Forwarded headers
    app.UseForwardedHeaders();

    // Global CORS
    app.UseCors(AllowedOriginsConf);

    // app.UseHttpsRedirection();

    app.UseRouting();

    app.UseAuthentication();
    app.UseAuthorization();

    app.UseMiddleware<LoggingService>();

    if (Program.RESTRICT_ACCESS)
    {

        app.UseWhen(
        ctx => !OpenRoutes.Any(r => ctx.Request.Path.Value.Contains(r)),
        builder =>
        {
            builder.Use(async (ctx, next) =>
            {
                using (var servicesScope = app.ApplicationServices.CreateScope())
                {
                    var services = servicesScope.ServiceProvider;
                    var _authService = services.GetService<IAuthorizationService>();
                    string authToken = _authService.GetAuthToken(ctx.Request);


                    if (authToken != null && authenticationService.ValidateUserToken(authToken))
                    {
                        string userId = authenticationService.GetUserIdFromToken(authToken);
                        if (ulong.TryParse(userId, out ulong id))
                        {
                            var _dbCtx = services.GetService<hairdressing_project_dbContext>();

                            var user = await _dbCtx.Users.FindAsync(id);

                            if (user != null)
                            {
                                if (RestrictedRoutes.Any(r => ctx.Request.Path.Value.Contains(r)))
                                {
                                    if (ctx.Request.Path.Value.StartsWith("/users") || ctx.Request.Path.Value.StartsWith("/accounts"))
                                    {
                                        var reqId = ctx.Request.Path.Value.Split("/").Last();

                                        if (!string.IsNullOrWhiteSpace(reqId) && reqId != "users")
                                        {
                                            if (ulong.TryParse(reqId, out ulong parsedPathId))
                                            {
                                                if (id != parsedPathId && user.UserRole != "admin")
                                                {
                                                    await ReturnErrorMessage(ctx);
                                                    return;
                                                }
                                            }
                                        }
                                        else
                                        {
                                            if (user.UserRole != "admin")
                                            {
                                                await ReturnErrorMessage(ctx);
                                                return;
                                            }
                                        }
                                    }
                                }
                                await next();
                                return;
                            }
                        }
                    }

                    await ReturnErrorMessage(ctx);
                    return;
                }

            });
        }
    );
    }

    app.UseEndpoints(endpoints =>
    {
        endpoints.MapControllers();
    });
}
1 Like

공유주신 코드만 봐서는 문제를 알기가 힘듭니다.

  1. 등록된 IAuthorizationService 서비스에 대한 정보
  2. authToken = _authService.GetAuthToken(ctx.Request)에서 Request정보로 인증토큰 정보를 가져오는 것으로 보이는데 authToken이 null이라는 말씀인지? 그렇다면 토큰정보가 왜 읽혀오지 않는지 확인 필요 (일반적으로 토큰 정보는 해더에 있습니다)
1 Like

답변 감사합니다.
말씀대로 헤더에 토큰값을 살펴보았더니 토큰값이 비워져 있었네요.
토큰값을 어떻게 해서 보내야 하나요?
image

1 Like

토큰값이 없다면 닷넷에서 어떻게 할 수 있는 부분이 아닙니다.

api.defysoft.tk로 통신을 주고받는 규칙에 뭔가 빠뜨렸거나 잘못 기입한 것은 없는지 확인해보셔야 할 것 같아요.
그래도 모르겠다면 저곳에 직접 문의하는 것이 빠를 것 같습니다.

1 Like

일반적으로 postman에서 “Authorization” 헤더에 “Bearer ~” 형식으로 많이 보냅니다.

1 Like