2016-04-05 5 views
0

Ich bin auf der Suche nach Kunden meiner Web API, die andere Clients mit SignalR authentifiziert haben. Ich verstehe die Grundlagen von SignalR, aber ich bin verwirrt, wie man den Hub so verändert, dass er mit einer API-Anfrage arbeiten kann.SignalR und Web API - Wie die Hub-Klasse zu ändern

Der Client ist eine Single Page Application, die jQuery zum Aufruf der Web API verwendet. Der Client authentifiziert sich zuerst mit der API, bevor er die API-Endpunkte verwenden kann.

Auch sollte hinzugefügt werden, dass ich mit OAuth im selben Projekt wie die Web API authentifizieren.

+1

Nun, Client den Server nach der Authentifizierung mitteilen könnte. Der Server könnte dann die Nachricht an alle anderen Clients senden (zum Beispiel im Signal-Chat) – alessalessio

+0

@alessalessio - Das klingt genau das, wonach ich suche. Wie kann ich den SignalR-Aufruf zur Authentifizierung der Web API hinzufügen? Muss die HTML-Seite, die den jQuery-Aufruf authentifizieren soll, die SignalR-Skripte wie das SignalR-Chat-Beispiel enthalten? Könnten Sie einen Beispielcode haben? – webworm

+0

Es ist nicht klar, wie Ihre Clients authentifiziert werden. Authentifizieren sie sich mit OAuth im selben Projekt wie die Web-API? Verwenden Sie Microsoft.Owin.Security.OAuth? –

Antwort

1

Nun, der einfachste Weg hier ist, einen Verweis auf den SignalR-Hub innerhalb der Oauth Authentifizierung Flux, und starten Sie dann eine globale Signalisierung nach dem erfolgreichen Abschluss dieser Methode: Task GrantResourceOwnerCredentials(OAuthGrantResourceOwnerCredentialsContext context).

Zum Beispiel:

public override async Task GrantResourceOwnerCredentials(OAuthGrantResourceOwnerCredentialsContext context) 
    { 
     // auth and other stuffs removed for brevity 
     // ... 
     // ... 
     context.Validated(ticket); 

     // then here 
     var hub = GlobalHost.ConnectionManager.GetHubContext<IMessageHub>("MessageHub"); 
     hub.Clients.All.ServerMessage(new {message = $"{context.UserName} is here!"}); 

    } 

mit einer Nachricht Nabe wie folgt aus:

public interface IMessageHub 
{ 
    void ServerMessage(object eventObject); 
} 

[HubName("MessageHub"), Authorize] 
public class MessageHub : Hub<IMessageHub> 
{ 
    public MessageHub() 
    { 

    } 
} 

Hoffe, es hilft :)

Verwandte Themen