0

저는 채팅 앱용 신호기 허브를 만들고 있습니다 (실제로는 아니지만 척할 수 있습니다). 사용자가 회의실 작성자에 의해 회의실에 초대 될 수 있도록 권한을 설정했습니다. 따라서 누가 소유하고 누가 액세스 권한을 부여 받았는지를 저장하는 테이블이 있습니다.[Authorize()]의 SignalR Hub 인수에 액세스하는 방법은 무엇입니까?

좋습니다. 다음 단계는 클레임을 추가하여 모든 요청에 ​​대해 누가 액세스했는지 확인할 필요가 없었습니다. 사용자가 채팅방에 가입하고 클레임을 추가하고 신호 연결을 시작하는 페이지로 보낼 때 한 번 확인합니다.

지금 내가 대신

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

사방 보일러를 던지는, 내 허브의 [권한 부여] 장식을 사용하고 싶습니다. 방 ID를 지정합니다 실제 인수 : 나는 하나를 제외하고 필요한 모든 부분을 https://docs.microsoft.com/en-us/aspnet/core/security/authorization/policies#security-authorization-policies-based

:

내가 여기에 사용자 정의 정책을 기반으로 인증을하는 방법까지 읽었습니다. 나는

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

에서 뭔가를 해킹 할 수 있었다 그러나 이것은 조금 추한 것, 그리고 그것이 내가이 JSON 정말 해키 보인다

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

를 직렬화 할 필요가 작동하도록. RoomId를 매개 변수로 전달하는 것이 좋습니다. 그것은 한 줄 아래에 있지만 멀리 세상을 보인다. 이것을 할 수있는 우아한 방법이 있습니까?

+0

잘못하고 있습니다. 해킹 한 것은 다른 전송을 선택하면 긴 폴링을 사용하기 때문에 일을하게됩니다. 다른 전송을 선택하면 액세스 할 수 없습니다. 데이터로 무엇을하고 싶은지 알 수 없지만 허브는 일시적입니다. 즉, 각 호출에 대해 새 인스턴스를 얻습니다. 따라서 허브에 항목을 저장하려면 작동하지 않습니다. 호출하려고하는'Initialize' 메소드에서 로직을 구현하지 않는 이유는 무엇입니까? – Pawel

+0

나는 시그널 러가 호출에 관한 메타 데이터 나 어떤 종류의 데이터 구조에 대해서도 깨끗한 api를 제공하지 않는다는 것에 상당히 화가났다. 실제로 호출을 연결하는 모든 작업을 수행 한 후에 이것이 사소한 것이라고 생각할 것입니다. 당신의 도움을 주셔서 감사합니다. – Josiah

+0

메쏘드가 불려지는 이유는 무엇인지 확실치 않은 메타 데이터가 필요한 이유는 무엇입니까? (메쏘드 이름과 매개 변수가 있습니까? 메타 데이터가 필요한 경우 메타 허브 기능을 만들고 거기에서 파견합니다. 또는 IHubRequestParser 또는 IParameterResolver를 살펴보십시오.하지만 아마 해킹 당할 것입니다. – Pawel

답변

0

주어진 메소드를 호출 할 권한을 부여하려면 AuthorizeAttribute을 허브 메소드에 넣을 수 있습니다. 허브 인증 및 인증에 도움이되는 this post도 있습니다.

+0

나는 [Authorize()]를 택하는 법을 안다. 내가 왜 타이핑하고 있는지 알지 못한다고 생각하는 이유를 모르겠다. – Josiah

+0

삭제 한 주석에서 Authorize 특성은 Hub 클래스가 아니라 Hub 클래스에만 넣을 수 있다고 생각한다고 말했기 때문입니다. – Pawel

관련 문제