0

我正在做一個聊天應用程序的信號中心(這不是真的,但讓我們假裝它)。 我有我的授權設置,以便用戶可以被房間的創建者邀請到房間。所以有一個表格來存儲誰擁有什麼,誰擁有訪問權限。如何從[Authorize()]訪問SignalR Hub參數?

這很好。接下來的步驟是添加索賠,以便我不必檢查誰可以訪問每個請求上的內容。當用戶嘗試加入聊天室時,我會檢查一次,添加他們的聲明並將它們發送到啓動信號連接的頁面。

現在我想用我的樞紐[授權]裝飾,而不是拋出樣板

user.Claims.Any(x=> x.ClaimType == $"CanJoinRoom_{RoomId}"); 

無處不在。 https://docs.microsoft.com/en-us/aspnet/core/security/authorization/policies#security-authorization-policies-based

我有一片一片,我需要的除了一個:實際參數指定房間ID

我已經就如何使這裏根據自定義策略的授權閱讀起來。我已經能夠從

[MyCustomAuthorizeMethod(this.Context.Request.Form["data"])] 

破解的東西,但這個似乎有點難看,並使其工作,我必須序列此JSON

{"H":"myhubname","M":"Initialize","A":[39],"I":0} 

這似乎真的哈克。我更喜歡傳遞RoomId作爲參數。 它只是一條線,但似乎是一個世界。有沒有一個優雅的方式來做到這一點?

+0

你這樣做是錯誤的。你被黑客攻擊的事情發生了,因爲你使用長輪詢後,一旦選擇了不同的交通工具,你將無法訪問它。我不知道你想用數據做什麼,但是集線器是暫時的 - 也就是說你會爲每個調用獲得一個新的實例,所以如果你想在集線器中存儲某些東西,那麼它將無法工作。你爲什麼不在你試圖調用的'Initialize'方法中實現你的邏輯? – Pawel

+0

我非常惱火,signalr不提供有關調用的元數據或任何類型的數據結構的乾淨apis。在經歷了所有實際接線調用的工作之後,你會認爲這將是微不足道的。謝謝你的幫助。 – Josiah

+0

爲什麼你需要元數據(不知道它是什麼),如果你的方法被調用 - 所以你有方法名稱和參數?如果你需要元數據(不管它是什麼),創建一個元中心功能並從那裏發送。或者看看IHubRequestParser或IParameterResolver,但它可能會得到hacky。 – Pawel

回答

0

如果您想授權調用給定的方法,您可以將AuthorizeAttribute置於集線器方法上。您也可以在集線器授權和身份驗證中找到this post

+0

我知道如何處理[Authorize()]。我不知道你爲什麼會認爲我不知道我打字的東西。 – Josiah

+0

因爲在評論中你刪除了你說你認爲Authorize屬性只能放在Hub類而不是Hub方法上。 – Pawel