HttpModuleを使用してカスタム認証と認証を行うアプリケーションを開発しています。私の問題は、HttpModuleで設定されたユーザーIDがSignalRコンテキストオブジェクトでアクセスできないことです。私はHttpModuleをBeginRequestイベントハンドラに次の操作を行いHttpModuleを使用してSignalRを認証することは可能です
は、カスタム認証ロジックの後:
var userClaims = new List<Claim>();
userClaims.Add(new Claim(ClaimTypes.NameIdentifier, <some id>));
userClaims.Add(new Claim(ClaimTypes.Name, <some name>));
userClaims.Add(new Claim(ClaimTypes.Email, <da email>));
userClaims.Add(new Claim(ClaimTypes.Authentication, "true"));
var id = new ClaimsIdentity(userClaims);
var principal = new ClaimsPrincipal(new[] { id });
Thread.CurrentPrincipal = principal;
HttpContext.Current.User = principal;
私は、これは絶対に要求が認証されたかのようにすべてが以下に動作するだろう、しかし、これはそうではないと思いました。
私はこのようになります認証を処理するためにSignalR AuthorizeAttributeクラスを作成しました:
[AttributeUsage(AttributeTargets.Class, Inherited = false, AllowMultiple = false)]
public class CustomAuthAttribute : AuthorizeAttribute
{
public override bool AuthorizeHubConnection(HubDescriptor hubDescriptor, IRequest request)
{
if (HttpContext.Current.Request.Path.StartsWith("/signalr/connect"))
{
var test = (ClaimsPrincipal)HttpContext.Current.User;
var test2 = (ClaimsPrincipal)Thread.Current.Principal;
}
return true;
}
public override bool AuthorizeHubMethodInvocation(IHubIncomingInvokerContext hubContext, bool appliesToMethod)
{
var test = (ClaimsPrincipal)hubContext.Hub.Context.User;
return true;
}
}
だから私の計画はいずれかを行うためにAuthorizeHubMethodInvocationメソッド内からhubContext.Hub.Context.UserのVARにアクセスすることでしたカスタム認可が必要でした。ただし、これにはデフォルトのWindowsPrincipalが含まれています。
AuthorizeHubConnection呼び出し(実際には通常のHTTP要求でwebsocket呼び出しではない)を調べると、HttpContext.Currentオブジェクトにはユーザーが設定したとおりに設定されていないことがわかります。
私はHttpContext.Current.Itemsコレクションにアクセスできることがわかります。私はこれを使って、モジュールからPrincetをSignalRコンテキストに投げることができたと思いますが、それが私がするべきことではないかと思います。
HttpModuleをOWINミドルウェアとして書き直すのが最も簡単ですか?とにかく/私たちがASP.NET 5に更新すると、私はものを変更しなければならないようです。あなたに雇用保障を与えるMS製品のようなものはありません。