选中“信号”属性中的“授权”
本文关键字:授权 属性 选中 信号 | 更新日期: 2023-09-27 17:53:34
我在ServiceStack上有一些服务,并在这个项目中使用SignalR。
现在,我想保护集线器连接(仅限经过身份验证的用户访问(,但我使用 ServiceStack 框架身份验证。(不是 asp.net 身份验证(和服务堆栈的会话(编写此会话和身份验证标志的 AuthUserId (。
因此,当用户尝试连接到集线器时 - 集线器必须检查身份验证...
(是的,我可以从中心请求 Cookie(例如,方法 OnConnected(,但 SignalR 在授权属性中检查身份验证 - 我必须在此类中执行此操作(而不是在中心(
(http://www.asp.net/signalr/overview/signalr-20/security/hub-authorization(
所以,我创建类
[AttributeUsage(AttributeTargets.Class, Inherited = false, AllowMultiple = false)]
public class AuthorizeMyAttribute : AuthorizeAttribute
{
protected override bool UserAuthorized(System.Security.Principal.IPrincipal user)
{
//... how can i request Cookies? / or may be can access for ServiceStack session...
// and return true or false
}
}
我能为它做什么?谢谢!
AuthorizeAttribute 还有两个虚拟方法:
-
AuthorizeHubConnection(HubDescriptor hubDescriptor, IRequest request)
-
AuthorizeHubMethodInvocation(IHubIncomingInvokerContext hubIncomingInvokerContext, bool appliesToMethod)
http://msdn.microsoft.com/en-us/library/microsoft.aspnet.signalr.authorizeattribute(v=vs.118(.aspx
这两种方法的默认实现都使用请求的IPrincipal
调用UserAuthorized
。
AuthorizeHubConnection
直接传递IRequest
。
在 AuthorizeHubMethodInvocation
中,您可以从IHubIncomingInvokerContext
访问IRequest
对象,如下所示:hubIncomingInvokerContext.Hub.Context.Request
。
我仍然为此苦苦挣扎了一段时间,试图从 SignalR.IRequest 获取 ServiceStack.Web.IRequest,这样我就可以使用 ServiceStack 的函数来请求会话以查看用户是否已被身份验证。最后我放弃了,从SignalR那里得到了饼干。我希望下面的代码片段可以帮助其他人解决这个问题。
public class AuthorizeAttributeEx : AuthorizeAttribute
{
public override bool AuthorizeHubConnection(HubDescriptor hubDescriptor, IRequest request)
{
return IsUserAuthorized(request);
}
public override bool AuthorizeHubMethodInvocation(IHubIncomingInvokerContext hubIncomingInvokerContext, bool appliesToMethod)
{
return IsUserAuthorized(hubIncomingInvokerContext.Hub.Context.Request);
}
protected bool IsUserAuthorized(IRequest thisRequest)
{
try
{
// Within the hub itself we can get the request directly from the context.
//Microsoft.AspNet.SignalR.IRequest myRequest = this.Context.Request; // Unfortunately this is a signalR IRequest, not a ServiceStack IRequest, but we can still use it to get the cookies.
bool perm = thisRequest.Cookies["ss-opt"].Value == "perm";
string sessionID = perm ? thisRequest.Cookies["ss-pid"].Value : thisRequest.Cookies["ss-id"].Value;
var sessionKey = SessionFeature.GetSessionKey(sessionID);
CustomUserSession session = HostContext.Cache.Get<CustomUserSession>(sessionKey);
return session.IsAuthenticated;
}
catch (Exception ex)
{
// probably not auth'd so no cookies, session etc.
}
return false;
}
}