C# 签入信号器属性
我在ServiceStack上有一些服务,并在这个项目中使用SignalR 现在,我想保护集线器连接(仅对经过身份验证的用户进行访问),但我使用ServiceStack框架身份验证。。(非asp.net身份验证)和ServiceStack的会话(将AuthUserId写入此会话和身份验证标志) 所以,当用户尝试连接到集线器时--集线器必须检查身份验证 (是的,我可以从集线器请求cookie(例如,方法OnConnected),但信号器在Authorize属性中检查身份验证-我必须在这个类中执行此操作(不在集线器中) () 所以,我创建了一个类C# 签入信号器属性,c#,asp.net,
servicestack,signalr,authorize,C#,Asp.net,
servicestack,Signalr,Authorize,我在ServiceStack上有一些服务,并在这个项目中使用SignalR 现在,我想保护集线器连接(仅对经过身份验证的用户进行访问),但我使用ServiceStack框架身份验证。。(非asp.net身份验证)和ServiceStack的会话(将AuthUserId写入此会话和身份验证标志) 所以,当用户尝试连接到集线器时--集线器必须检查身份验证 (是的,我可以从集线器请求cookie(例如,方法OnConnected),但信号器在Authorize属性中检查身份验证-我必须在这个类中执行此
[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请求)
AuthorizeHubMethodInvocation(ihubinomingInvokerContext hubinomingInvokerContext,bool appliesToMethod)
IPrincipal
调用UserAuthorized
authorizehub连接
直接传递一个
在
AuthorizeHubMethodInvocation
中,您可以从IHubIncomingInvokerContext
中访问IRequest
对象,如下所示:hubIncomingInvokerContext.Hub.Context.Request
我在尝试从signer.IRequest中获取ServiceStack.Web.IRequest时仍在挣扎,因此我可以使用ServiceStack的函数请求会话查看用户是否已被验证。最后,我放弃了,并从SignalR获得了cookies。我希望下面的代码片段可以帮助其他人对此进行验证
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;
}
}
公共类AuthorizeAttributeEx:AuthorizeAttribute
{
公共覆盖bool AuthorizeHubConnection(HubDescriptor HubDescriptor,IRequest请求)
{
返回IsUserAuthorized(请求);
}
public override bool AuthorizeHubMethodInvocation(IHubIncomingInvokerContext hubIncomingInvokerContext,bool appliesToMethod)
{
返回IsUserAuthorized(hubinomingInvokerContext.Hub.Context.Request);
}
受保护的bool IsUserAuthorized(IRequest thisRequest)
{
尝试
{
//在中心本身中,我们可以直接从上下文获取请求。
//Microsoft.AspNet.signar.IRequest myRequest=this.Context.Request;//不幸的是,这是一个signer IRequest,不是ServiceStack IRequest,但我们仍然可以使用它来获取cookie。
bool perm=thisRequest.Cookies[“ss opt”]。Value==“perm”;
字符串sessionID=perm?thisRequest.Cookies[“ss pid”]。值:thisRequest.Cookies[“ss id”]。值;
var sessionKey=SessionFeature.GetSessionKey(sessionID);
CustomUserSession session=HostContext.Cache.Get(sessionKey);
return session.IsAuthenticated;
}
捕获(例外情况除外)
{
//可能没有授权,因此没有cookies、会话等。
}
返回false;
}
}
您无法从ServiceStack中访问“user”?很遗憾,我不知道如何才能访问。“user”--这是Asp.Net(不是ServiceStack)变量..我只想在ServiceStack中授权用户..您怎么看?那么,我可以为当前http请求上下文获取所需的ServiceStack服务吗?(例如,使用“ss id”和“ss pid”cookies)并检查此会话的授权以完成此问题:--因此,我们可以检查用户的会话hubinominginvokercontext.Hub.Context.Request
是我搜索的-谢谢