2017-10-16 12 views
0

OpenIddict를 사용하여 ASP.NET Core 2.0 응용 프로그램에서 JWT 인증을 사용하고 있습니다.JWT를 사용하여 SignalR Core Hub 메서드를 인증하는 방법

나는 this thread에있는 아이디어를 따르고 SignalR 핸드 셰이크 후에 AuthorizeWithJWT 메서드를 호출합니다. 하지만 지금은 AuthorizeWithJWT 메서드에서 무엇을 설정해야할지 모르겠으므로 예를 들어 [Authorize(Roles="Admin")]을 사용할 수 있습니다.

나는 설정 상황에 맞는 사용자와 시도,하지만 읽기 전용 :

public class BaseHub : Hub 
{  
    public async Task AuthorizeWithJWT(string AccessToken) 
    { 
     //get user claims from AccesToken 
     this.Context.User = user; //error User is read only 
    } 
} 

그리고 속성을 부여하여 :

public class VarDesignImportHub : BaseHub 
{ 
    [Authorize(Roles = "Admin")] 
    public async Task Import(string ConnectionString) 
    { 
    } 
} 

답변

2

난 강력하게 악수 수준에서 인증을 수행하는 대신 지속될하는 것이 좋습니다 SignalR 레벨에서 구현할 수있는 맞춤형 및 비표준 솔루션을 제공합니다.

유효성 검증 처리기를 사용하는 가정하면, 쿼리 문자열에서 액세스 토큰을 검색하는 강제 할 수

public void ConfigureServices(IServiceCollection services) 
{ 
    services.AddAuthentication() 
     .AddOAuthValidation(options => 
     { 
      options.Events.OnRetrieveToken = context => 
      { 
       context.Token = context.Request.Query["access_token"]; 

       return Task.CompletedTask; 
      }; 
     }); 
} 

또는 OnMessageReceived을 사용하려는 경우 JWTBearer :

services.AddAuthentication() 
    .AddJwtBearer(o => 
    { 
     o.Events = new JwtBearerEvents() 
     { 
      OnMessageReceived = context => 
      { 
       if (context.Request.Path.ToString().StartsWith("/HUB/")) 
        context.Token = context.Request.Query["access_token"]; 
       return Task.CompletedTask; 
      }, 
     }; 
    }); 

다른 변경은 필요하지 않습니다.

+0

예, 이것은 유효한 사례이지만 github 스레드 ([link1] (https://github.com/aspnet/SignalR/issues/888#issuecomment-330727192), [link2] (https : /github.com/aspnet/SignalR/issues/888#issuecomment-330721385))이 접근 방식에는 몇 가지 보안 위험이 있습니다. 쿼리의 access_token은 public이므로 (당신은 그것을 기록 할 수 있습니다 ...). 다른 방법이 가능하지 않으면 그렇게 할 것입니다. – Makla

+0

그러나 한 번 액세스 토큰이 가능합니까? @Pinpoint 어떻게 생각하세요? – Makla

+0

유일한 위험은 액세스 토큰이 로그에 포함된다는 것입니다 (OAuth2 베어러 사양에서 명확하게 설명 됨). 이를 방지하기 위해 필터링 API를 사용하여 쿼리 문자열을 비롯한 로깅 추적을 사용하지 않도록 설정할 수 있습니다. – Pinpoint