首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >选中在SignalR属性中授权

选中在SignalR属性中授权
EN

Stack Overflow用户
提问于 2014-03-26 09:52:41
回答 2查看 11K关注 0票数 9

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

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

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

(可以,我可以从集线器请求Cookie(例如,方法OnConnected ),但是SignalR检查Authorize属性中的身份验证-并且我必须在这个类中(而不是在集线器中)进行验证)

(http://www.asp.net/signalr/overview/signalr-20/security/hub-authorization)

因此,我创建了类

代码语言:javascript
复制
[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
   }
}

我能为它做些什么?谢谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-03-27 02:49:58

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

票数 9
EN

Stack Overflow用户

发布于 2017-04-16 06:04:53

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

代码语言:javascript
复制
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;
    }
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22650011

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档