ここに私があなたに伝えたコードがあります。
私は外部OAuth2サーバを認証に使用していますので、SignalRは何らかの理由でアクセストークンを渡す必要があります。これは、SignalRが前後のメッセージにWebソケットを使用するためです。 Webソケットではサポートされていません。
私は私のようにそのクエリ文字列を受け取り、ヘッダに追加したミドルウェアを追加しました私のSignalRに続いて、このよう(JavaScriptクライアント)クエリ文字列パラメータとして
$.connection.hub.qs = "access_token=" + mytoken;
をそのアクセストークンを渡していますベアラトークンを使用する認証ヘッダー。これは私のスタートアップクラスで、このように行われているミドルウェアのコードは、この1つの
namespace Owin
{
public static class AuthorizationQSTokenExtractorExtension
{
public static void UseAuthQSTokenExtractor(this IAppBuilder app)
{
app.Use<AuthorizationQsTokenExtractorMiddleware>();
}
}
}
namespace Chat.Middleware
{
public class AuthorizationQsTokenExtractorMiddleware : OwinMiddleware
{
public AuthorizationQsTokenExtractorMiddleware(OwinMiddleware next)
: base(next)
{
}
public override async Task Invoke(IOwinContext context)
{
Debug.WriteLine("signalr-auth-middleware");
string bearerToken = context.Request.Query.Get("access_token");
Debug.WriteLine("signar-bearer: " + bearerToken);
if (bearerToken != null)
{
TokenHelper.DecodeAndWrite(bearerToken);
string[] authorization = { "Bearer " + bearerToken };
context.Request.Headers.Add("Authorization", authorization);
}
await Next.Invoke(context);
}
}
マイ起動クラスは、あなたがに見ることができるこの
app.UseCors(CorsOptions.AllowAll);
app.UseAuthQSTokenExtractor();
JwtSecurityTokenHandler.InboundClaimTypeMap = new Dictionary<string, string>();
app.UseIdentityServerBearerTokenAuthentication(
new IdentityServerBearerTokenAuthenticationOptions
{
Authority = ConfigurationManager.AppSettings["api:idserver"],
RequiredScopes = new[]
{
"chat-hub"
}
});
var hubConfiguration = new HubConfiguration();
hubConfiguration.EnableDetailedErrors = true;
app.RunSignalR(hubConfiguration);
のように見えます
app.UseAuthQSTokenExtractor();
ある
上記のコードで、SignalRにOauth2 Serverを使用するように指示します。そのコードはこのコードです。
app.UseIdentityServerBearerTokenAuthentication(
new IdentityServerBearerTokenAuthenticationOptions
{
Authority = ConfigurationManager.AppSettings["api:idserver"],
RequiredScopes = new[]
{
"chat-hub"
}
});
このすべては、私は私のContext.User.Identity.Nameへのアクセス権を持っていて、他の人があなたは私がする上そのコードを使用しています。この
var identity = Context.User.Identity as ClaimsIdentity;
を行うことができますIdentityClaim取得したい場合に設定された後、私はそれはあなたがsignalrに使用している認証の種類を
役に立てば幸いこの
ようsubjectId(ユーザーID)を取得? –
@JGEstevez申し訳ありませんが、私はSignalRを初めて使っています。私はそれがちょうどウェブの部分のようだと思った。私はそれが文脈を共有すると思った。 – eestein
はい、ハブまたはあなたのハブ関数の1つをauthorize属性で飾る必要があります。スタートアップクラスでは、Web apiまたはmvcプロジェクトの場合と同じように認証を設定する必要があります。私の場合は –