私はSignalR.Hubで作業しており、SignalR.AuthorizeAttributeでカスタム認可を取得しています。私は、ハブを使用するためにユーザーが認証されたことを確認するために取得するセッションをパスしようとしています。SignalR.AuthorizeAttributeからSignalR.Hubへのセッションを取得する
私はすべてのプロパティを調べました。ほとんどの場合、読み取り専用です。私はSignalR.IRequest.Environmentに何かを追加することができますが、スレッドセーフではないようであり、不適切と思われます。
HubCallerContext +私のセッションでタックできる方法でそれを使用するすべてを拡張できますか?
カスタム認証
[AttributeUsage(AttributeTargets.Class, Inherited = false, AllowMultiple = false)]
public class HubAuthorize : AuthorizeAttribute
{
public override bool AuthorizeHubConnection(HubDescriptor hubDescriptor, IRequest request)
{
return VerifySession(request);
}
public override bool AuthorizeHubMethodInvocation(IHubIncomingInvokerContext hubIncomingInvokerContext, bool appliesToMethod)
{
//Could I add something to the HubIncomingInvokerContext?
return VerifySession(hubIncomingInvokerContext.Hub.Context.Request);
}
public bool VerifySession(IRequest request)
{
bool success = false;
string token = "";
bool isApiToken = false;
// Check for token Header Auth
if (string.IsNullOrWhiteSpace(token))
{
token = request.QueryString["X-Custom-Token"];
if (string.IsNullOrWhiteSpace(token))
{
token = request.QueryString["X-Custom-Token"];
isApiToken = true;
}
}
SessionResponse session = null;
if (!string.IsNullOrWhiteSpace(token))
{
session = isApiToken ? ValidateApiToken(token) : ValidateToken(token);
}
if (session != null)
{
//Add Session to request! So I dont have to hit the db again..
//request.Add(new KeyValuePair<string, object>("session", session));
success = true;
}
return success;
}
//... other methods that aren't relevant
}
あなたはあなたが認証されていることを確認したときにセッションを取得するためにそれを使用傾ける場合はハブ
[HubAuthorize]
public class NotificationHub : Hub
{
public void Send(string name, string message)
{
// Use the session here
Clients.All.broadcastMessage(name, message);
}
public override Task OnConnected()
{
Console.WriteLine(Context.ConnectionId);
return base.OnConnected();
}
}
はなぜカスタム権限を持っていますか?たぶん私は何かが欠けているかもしれませんが、かなりイライラしています。/endrant