2017-10-16 23 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は公開されているため(ログに記録することができます)他のアプローチが可能でなければ、それを行います。 – Makla

+0

しかし、一度のアクセストークンでそれを行うことはできますか? @Pinpointあなたはどう思いますか? – Makla

+0

唯一の「危険」は、アクセストークンがログに含まれることです(これはOAuth2ベアラ仕様で明確に説明されています)。これを避けるには、フィルタリングAPIを使用してクエリ文字列を含むロギングトレースを無効にすることができます。 – Pinpoint

関連する問題