【问题标题】:Check authorize in SignalR attribute检查 SignalR 属性中的授权
【发布时间】:2014-03-26 01:52:41
【问题描述】:

我在 ServiceStack 上有一些服务,并在这个项目中使用 SignalR。

现在,我想保护集线器连接(仅对经过身份验证的用户访问),但我使用 ServiceStack 框架身份验证..(不是 asp.net 身份验证)和 ServiceStack 的会话(在此会话和身份验证标志中写入 AuthUserId)。

因此,当用户尝试连接到集线器时——集线器必须检查身份验证...

(是的,我可以从 Hub 请求 Cookie(例如 OnConnected 方法),但 SignalR 在 Authorize Attribute 中检查身份验证 - 我必须在此类中进行(而不是在 hub 中)

(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
   }
}

我能做些什么呢? 谢谢!

【问题讨论】:

  • 您无法从 ServiceStack 中访问“用户”?
  • 不幸的是,我不知道该怎么做。还有“用户”——这是 Asp.Net(不是 ServiceStack)变量。我想只在 ServiceStack 中授权用户。你怎么看?

标签: c# asp.net servicestack signalr authorize


【解决方案1】:

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

【讨论】:

  • 那么,我可以获得当前 http 请求上下文所需的 ServiceStack 服务吗? (例如,使用“ss-id”和“ss-pid”cookies)并检查此会话的授权
  • 完成这个问题:stackoverflow.com/questions/12064166/… -- 这样,我们可以检查用户的会话
  • hubIncomingInvokerContext.Hub.Context.Request 是我正在寻找的 - 谢谢
【解决方案2】:

我仍然为此苦苦挣扎了一段时间,试图从 SignalR.IRequest 获取 ServiceStack.Web.IRequest,因此我可以使用 ServiceStack 的函数来请求会话以查看用户是否已通过身份验证。最后我放弃了,从 SignalR 那里得到了 cookie。我希望下面的代码 sn-p 可以帮助其他人解决这个问题。

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;
    }
}

【讨论】:

    猜你喜欢
    • 2015-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-06
    • 2011-09-28
    • 2018-11-23
    相关资源
    最近更新 更多