ProgramingTip

베어러 토큰과 쿠키 인증을 함께 사용

bestdevel 2020. 11. 25. 08:15
반응형

베어러 토큰과 쿠키 인증을 함께 사용


인증을 위해 전달자 토큰사용하는 단일 페이지 앱 (MVC5 SPA 템플릿 기반)이 있습니다.

이 사이트에는 또한 보안이 필요하지만 쿠키 인증을 사용하는 두 개의 기존 MVC 페이지가 있습니다 .

Startup.Auth에서 두 가지 유형의 인증을 모두 활성화 할 수 있습니다.

app.UseCookieAuthentication(new CookieAuthenticationOptions());
app.UseOAuthBearerTokens(OAuthOptions);

그러나 이것은 AJAX 요청이 SPA에서 전송 될 때마다 헤더 쿠키 의 베어러 토큰을 모두 전송한다는 점에서 부작용이있는 것 입니다.

내가 원하는 행위 동작 은 WebAPI 호출에는 베어러 토큰 사용하고 MVC 호출에는 쿠키 만 사용한다는 것입니다.

또한 MVC 호출이 승인되지 않은 경우 (CookieAuthenticationOption으로 설정) 로그인 페이지로 리디렉션되기를 원하지만 API 호출을 할 때 발생하는 것을 선언합니다.

한 응용 프로그램 내에서 전형적인 유형의 혼합 모드 인증을 있습니까? 아마도 경로 / 경로 필터를 통해?


나는 문서 해결 생각한다.

Startup.Auth는 OWIN 파이프 라인을 연결하는 방법에 쿠키와 토큰을 포함하는 것이 옳습니다. 그러나 쿠키 옵션에 대한 한 가지 변경 사항은 적용해야하는 인증 유형을 지정합니다.

CookieOptions = new CookieAuthenticationOptions
{
  AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie   
};

그런 다음 토큰 만 사용하도록 WebAPI를 구성해야합니다.

public static void Configure(HttpConfiguration config)
{
   // Configure Web API to use only bearer token authentication.
   config.SuppressDefaultHostAuthentication();
   config.Filters.Add(new HostAuthenticationFilter(OAuthDefaults.AuthenticationType));
}

이것은 내가 원하는 것을 달성하는 것입니다. WebAPI는 베어러 토큰 만 사용하고 쿠키는 사용하지 않습니다. 기존 MVC 페이지는 로그인하면 쿠키를 사용합니다 (AuthenticationManager 사용).


http-only 모드에서 jwt 토큰을 쿠키 (여기서는 내 jwt 토큰 쿠키 이름은 "access_token")에 추가하고 이와 같은 미들웨어를 만들 수 있습니다.

public class JwtCookieMiddleware
{
    private readonly RequestDelegate _next;

    public JwtCookieMiddleware(RequestDelegate next)
    {
        _next = next;
    }

    public Task Invoke(HttpContext ctx)
    {
        if (ctx.Request.Cookies.TryGetValue("access_token", out var accessToken))
        {
            if (!string.IsNullOrEmpty(accessToken))
            {
                string bearerToken = String.Format("Bearer {0}", accessToken);
                ctx.Request.Headers.Add("Authorization",bearerToken);
            }
        }
        return this._next(ctx);
    }
}
public static class JwtCookieMiddlewareExtensions
{
    public static IApplicationBuilder UseJwtCookie(this IApplicationBuilder build)
    {
        return build.UseMiddleware<JwtCookieMiddleware>();
    }
}

그리고 다음과 같이 시작시 미들웨어를 사용합니다.

app.UseJwtCookie();
app.UseAuthentification();
app.UseMvc();

위 코드는이 요청에 토큰 쿠키가있는 경우 http 요청 헤더에 jwt 토큰을 추가합니다.

참고 URL : https://stackoverflow.com/questions/20953738/using-bearer-tokens-and-cookie-authentication-together

반응형