servicestack,signalr,authorize,C#,Asp.net,servicestack,Signalr,Authorize" /> servicestack,signalr,authorize,C#,Asp.net,servicestack,Signalr,Authorize" />

C# 签入信号器属性

C# 签入信号器属性,c#,asp.net,servicestack,signalr,authorize,C#,Asp.net,servicestack,Signalr,Authorize,我在ServiceStack上有一些服务,并在这个项目中使用SignalR 现在,我想保护集线器连接(仅对经过身份验证的用户进行访问),但我使用ServiceStack框架身份验证。。(非asp.net身份验证)和ServiceStack的会话(将AuthUserId写入此会话和身份验证标志) 所以,当用户尝试连接到集线器时--集线器必须检查身份验证 (是的,我可以从集线器请求cookie(例如,方法OnConnected),但信号器在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
是我搜索的-谢谢