私はSignalR承認属性をカスタム承認プロバイダー(MVCAuthorizationと呼ばれる)と統合する方法に取り組んできました。ハブ用の承認プロバイダーを具体的に再作成しようとするいくつかのうさぎの穴を掘り下げましたが、それは非常に複雑であることがわかりました。それで、既存のコントローラーとアクション認証をSignalRハブとメソッドとどのように統合できるのか疑問に思いました。
2 に答える
IAuthorizationプロバイダーを取得できることがわかりました。
ハブをコントローラーとして扱い、メソッドをアクションとして扱う場合は、IAuthorizeHubConnectionとIAuthorizeHubMethodInvocationを実装するSignalR属性を作成するだけです。
public class HubAuthorizeAttribute : Attribute, IAuthorizeHubConnection,IAuthorizeHubMethodInvocation
{
public virtual bool AuthorizeHubConnection(HubDescriptor hubDescriptor, Microsoft.AspNet.SignalR.IRequest request)
{
IAuthorizationProvider authorizationProvider = DependencyResolver.Current.GetService<IAuthorizationProvider>();
return authorizationProvider.IsAuthorizedController(hubDescriptor.Name);
}
public virtual bool AuthorizeHubMethodInvocation(IHubIncomingInvokerContext hubIncomingInvokerContext)
{
IAuthorizationProvider authorizationProvider = DependencyResolver.Current.GetService<IAuthorizationProvider>();
return authorizationProvider.IsAuthorizedAction(hubIncomingInvokerContext.MethodDescriptor.Hub.Name, hubIncomingInvokerContext.MethodDescriptor.Name);
}
}
次に、あなたがしなければならないのは、あなたのハブまたはあなたが許可したい任意のメソッドに属性を置くことです
[HubAuthorize]
public class Message : Hub
{
public void Send(string message)
{
}
}
パイプラインの既存のメソッドをオーバーライドする必要があります
http://www.asp.net/signalr/overview/signalr-20/security/hub-authorization
AuthorizeHubMethodInvocationをオーバーライドすると、UserAuthorizedをオーバーライドしながらリクエストを承認でき、認証が可能になります(ユーザーのロールなどを確認できます)。
HubAuthorizeAttributeにAuthorizeAttributeを継承させ、コンストラクターがロールのリストを取得できるようにします
役割を処理する方法の簡単な例を次に示しますhttp://www.jasonwatmore.com/post/2014/02/18/ASPNET-Web-API-2-Enum-Authorize-Attribute.aspx