簡體   English   中英

檢查SignalR屬性中的授權

[英]Check authorize in SignalR attribute

我在ServiceStack上有一些服務,並在這個項目中使用SignalR。

現在,我想保護集線器連接(僅對經過身份驗證的用戶進行訪問),但我使用ServiceStack框架身份驗證..(不是asp.net身份驗證)和ServiceStack的會話(寫入AuthUserId ih此會話和身份驗證標志)。

因此,當用戶嘗試連接到集線器時 - 集線器必須檢查身份驗證...

(是的,我可以從Hub請求Cookie(例如,OnConnected方法),但是在Authorize Attribute中檢查身份驗證 - 我必須在此類中進行(不在集線器中)

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對象, IHubIncomingInvokerContext所示: hubIncomingInvokerContext.Hub.Context.Request

我仍然在努力嘗試從SignalR.IRequest獲取ServiceStack.Web.IRequest一段時間,因此我可以使用ServiceStack的函數來請求會話以查看用戶是否已經過身份驗證。 最后我放棄了並從SignalR獲得了cookie。 我希望以下代碼片段可以幫助其他人解決這個問題。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM