[英]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.