Z tego samouczka dowiesz się, jak utworzyć i zintegrować metodę uwierzytelniania przy użyciu usługi Microsoft Azure SignalR Service.
Uwierzytelnianie początkowo używane w aplikacji pokoju rozmów przewodnika Szybki start jest zbyt proste dla realnych scenariuszy. Aplikacja umożliwia każdemu klientowi oświadczenie, kim jest, a serwer po prostu to zaakceptuje. Takie podejście jest nieskuteczne w świecie rzeczywistym, ponieważ złośliwi użytkownicy mogą używać fałszywych tożsamości do uzyskiwania dostępu do poufnych danych.
Usługa GitHub zapewnia interfejsy API uwierzytelniania bazujące na popularnym, będącym standardem branżowym protokole o nazwie OAuth. Te interfejsy API umożliwiają aplikacjom innych firm uwierzytelnianie kont usługi GitHub. W tym samouczku możesz użyć tych interfejsów API do zaimplementowania uwierzytelniania za pośrednictwem konta usługi GitHub przed zezwoleniem na logowanie klientów do aplikacji pokoju rozmów. Po uwierzytelnieniu konta usługi GitHub informacje o koncie zostaną dodane jako plik cookie, który będzie używany przez klienta internetowego do uwierzytelniania.
Do wykonania kroków tego przewodnika Szybki start możesz użyć dowolnego edytora kodu. Doskonałym wyborem jest program Visual Studio Code, dostępny na platformach Windows, macOS i Linux.
Otwórz przeglądarkę internetową, przejdź do witryny https://github.com i zaloguj się na swoje konto.
W przypadku konta przejdź do pozycji Ustawienia Ustawienia Ustawienia>Aplikacje> OAuth i wybierz pozycję Nowa aplikacja OAuth w obszarze Aplikacje OAuth.
Użyj następujących ustawień dla nowej aplikacji OAuth, a następnie wybierz pozycję Zarejestruj aplikację:
Nazwa ustawienia
Sugerowana wartość
opis
Nazwa aplikacji
Azure SignalR Chat
Użytkownik usługi GitHub powinien mieć możliwość rozpoznawania i zaufania aplikacji, za pomocą której uwierzytelniają się.
Homepage URL (Adres URL strony głównej)
https://localhost:5001
Application description (Opis aplikacji)
Przykład pokoju rozmów z użyciem usługi Azure SignalR Service z uwierzytelnianiem usługi GitHub
Przydatny opis aplikacji, która ułatwia użytkownikom aplikacji zrozumienie kontekstu używanego uwierzytelniania.
To ustawienie jest najważniejszym ustawieniem Twojej aplikacji OAuth. To jest adres URL wywołania zwrotnego, który usługa GitHub zwraca użytkownikowi po pomyślnym uwierzytelnieniu. W tym samouczku musisz użyć domyślnego adresu URL wywołania zwrotnego dla pakietu AspNet.Security.OAuth.GitHub, czyli /signin-github.
Po zakończeniu rejestracji nowej aplikacji OAuth dodaj wartości Client ID i Client Secret do narzędzia Secret Manager za pomocą następujących poleceń. Zastąp wartości Your_GitHub_Client_Id i Your_GitHub_Client_Secret wartościami dla Twojej aplikacji OAuth.
.NET CLI
dotnetuser-secrets set GitHubClientId Your_GitHub_Client_Id
dotnetuser-secrets set GitHubClientSecret Your_GitHub_Client_Secret
Aktualizacja Program.cs w celu obsługi uwierzytelniania w usłudze GitHub
Dodaj odwołanie do najnowszych pakietów AspNet.Security.OAuth.GitHub i przywróć wszystkie pakiety.
.NET CLI
dotnetadd package AspNet.Security.OAuth.GitHub
Otwórz Program.cs i zaktualizuj kod do następującego fragmentu kodu:
C#
using Microsoft.AspNetCore.Authentication.Cookies;
using Microsoft.AspNetCore.Authentication.OAuth;
using System.Net.Http.Headers;
using System.Security.Claims;
var builder = WebApplication.CreateBuilder(args);
builder.Services
.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)
.AddCookie()
.AddGitHub(options =>
{
options.ClientId = builder.Configuration["GitHubClientId"] ?? "";
options.ClientSecret = builder.Configuration["GitHubClientSecret"] ?? "";
options.Scope.Add("user:email");
options.Events = new OAuthEvents
{
OnCreatingTicket = GetUserCompanyInfoAsync
};
});
builder.Services.AddControllers();
builder.Services.AddSignalR().AddAzureSignalR();
var app = builder.Build();
app.UseHttpsRedirection();
app.UseDefaultFiles();
app.UseStaticFiles();
app.UseRouting();
app.UseAuthorization();
app.MapControllers();
app.MapHub<ChatSampleHub>("/chat");
app.Run();
staticasync Task GetUserCompanyInfoAsync(OAuthCreatingTicketContext context)
{
var request = new HttpRequestMessage(HttpMethod.Get, context.Options.UserInformationEndpoint);
request.Headers.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", context.AccessToken);
var response = await context.Backchannel.SendAsync(request,
HttpCompletionOption.ResponseHeadersRead, context.HttpContext.RequestAborted);
var user = await response.Content.ReadFromJsonAsync<GitHubUser>();
if (user?.company != null)
{
context.Principal?.AddIdentity(new ClaimsIdentity(new[]
{
new Claim("Company", user.company)
}));
}
}
classGitHubUser
{
publicstring? company { get; set; }
}
Wewnątrz kodu AddAuthentication i UseAuthentication są używane do dodawania obsługi uwierzytelniania za pomocą aplikacji GitHub OAuth, a GetUserCompanyInfoAsync metoda pomocnika to przykładowy kod pokazujący sposób ładowania informacji firmowych z uwierzytelniania OAuth w usłudze GitHub i zapisywania ich w tożsamości użytkownika. Można również zauważyć, że UseHttpsRedirection() jest używany, ponieważ plik cookie zestawu secure OAuth usługi GitHub przechodzi tylko do zabezpieczonego https schematu. Nie zapomnij również zaktualizować lokalnego Properties/launchSettings.json punktu końcowego, aby dodać punkt końcowy https:
W tej sekcji zaimplementujesz Login interfejs API, który uwierzytelnia klientów przy użyciu aplikacji GitHub OAuth. Po uwierzytelnieniu interfejs API dodaje plik cookie do odpowiedzi klienta internetowego przed przekierowaniem klienta z powrotem do aplikacji do czatu. Ten plik cookie jest następnie używany do identyfikowania klienta.
Dodaj nowy plik kodu kontrolera do katalogu GitHubChat\Controllers . Nadaj plikowi nazwę AuthController.cs.
Dodaj następujący kod do kontrolera uwierzytelniania. Pamiętaj, aby zaktualizować przestrzeń nazw, jeśli katalog projektu nie był gitHubChat:
C#
using AspNet.Security.OAuth.GitHub;
using Microsoft.AspNetCore.Authentication;
using Microsoft.AspNetCore.Mvc;
namespaceGitHubChat.Controllers
{
[Route("/")]
publicclassAuthController : Controller
{
[HttpGet("login")]
public IActionResult Login()
{
if (User.Identity == null || !User.Identity.IsAuthenticated)
{
return Challenge(GitHubAuthenticationDefaults.AuthenticationScheme);
}
HttpContext.Response.Cookies.Append("githubchat_username", User.Identity.Name ?? "");
HttpContext.SignInAsync(User);
return Redirect("/");
}
}
}
Zapisz zmiany.
Aktualizacja klasy Hub
Domyślnie klient internetowy łączy się z usługą SignalR Service przy użyciu tokenu dostępu wygenerowanego automatycznie przez zestaw SDK usługi Azure SignalR.
W tej sekcji zintegrujesz rzeczywisty przepływ pracy uwierzytelniania przez dodanie atrybutu Authorize do klasy centrum i zaktualizujesz metody centrum, aby odczytać nazwę użytkownika z oświadczenia uwierzytelnionego użytkownika.
Otwórz plik Hub\ChatSampleHub.cs i zaktualizuj kod do poniższego fragmentu kodu. Kod dodaje Authorize atrybut do ChatSampleHub klasy i używa tożsamości uwierzytelnionej użytkownika w metodach centrum.
OnConnectedAsync Ponadto metoda jest dodawana, która rejestruje komunikat systemowy do pokoju rozmów za każdym razem, gdy nowy klient nawiązuje połączenie.
C#
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.SignalR;
[Authorize]
publicclassChatSampleHub : Hub
{
publicoverride Task OnConnectedAsync()
{
return Clients.All.SendAsync("broadcastMessage", "_SYSTEM_", $"{Context.User?.Identity?.Name} JOINED");
}
// Uncomment this line to only allow user in Microsoft to send message//[Authorize(Policy = "Microsoft_Only")]public Task BroadcastMessage(string message)
{
return Clients.All.SendAsync("broadcastMessage", Context.User?.Identity?.Name, message);
}
public Task Echo(string message)
{
var echoMessage = $"{message} (echo from server)";
return Clients.Client(Context.ConnectionId).SendAsync("echo", Context.User?.Identity?.Name, echoMessage);
}
}
Zapisz zmiany.
Aktualizacja kodu klienta internetowego
Otwórz plik wwwroot\index.html i zastąp kod, który wyświetla monit o nazwę użytkownika, kodem, który używa pliku cookie zwróconego przez kontroler uwierzytelniania.
Zaktualizuj kod wewnątrz funkcji getUserName w index.html , aby użyć plików cookie:
JavaScript
functiongetUserName() {
// Get the user name cookie.functiongetCookie(key) {
var cookies = document.cookie.split(";").map((c) => c.trim());
for (var i = 0; i < cookies.length; i++) {
if (cookies[i].startsWith(key + "="))
returnunescape(cookies[i].slice(key.length + 1));
}
return"";
}
return getCookie("githubchat_username");
}
Zaktualizuj onConnected funkcję w celu usunięcia parametru username podczas wywoływania metody broadcastMessage centrum i echo:
JavaScript
functiononConnected(connection) {
console.log("connection started");
connection.send("broadcastMessage", "_SYSTEM_", username + " JOINED");
document.getElementById("sendmessage").addEventListener("click", function (event) {
// Call the broadcastMessage method on the hub.if (messageInput.value) {
connection.invoke("broadcastMessage", messageInput.value)
.catch((e) => appendMessage("_BROADCAST_", e.message));
}
// Clear text box and reset focus for next comment.
messageInput.value = "";
messageInput.focus();
event.preventDefault();
});
document.getElementById("message").addEventListener("keypress", function (event) {
if (event.keyCode === 13) {
event.preventDefault();
document.getElementById("sendmessage").click();
returnfalse;
}
});
document.getElementById("echo").addEventListener("click", function (event) {
// Call the echo method on the hub.
connection.send("echo", messageInput.value);
// Clear text box and reset focus for next comment.
messageInput.value = "";
messageInput.focus();
event.preventDefault();
});
}
W dolnej części index.html zaktualizuj program obsługi błędów, connection.start() jak pokazano poniżej, aby monitować użytkownika o zalogowanie.
JavaScript
connection.start()
.then(function () {
onConnected(connection);
})
.catch(function (error) {
console.error(error.message);
if (error.statusCode && error.statusCode === 401) {
appendMessage(
"_BROADCAST_",
"You\"re not logged in. Click <a href="/login">here</a> to login with GitHub."
);
}
});
Zapisz zmiany.
Lokalne kompilowanie i uruchamianie aplikacji
Zapisz zmiany we wszystkich plikach.
Wykonaj następujące polecenie, aby uruchomić aplikację internetową lokalnie:
.NET CLI
dotnetrun
Aplikacja jest hostowana lokalnie na porcie 5000 domyślnie:
Output
info: Microsoft.Hosting.Lifetime[14]
Now listening on: http://0.0.0.0:5000
info: Microsoft.Hosting.Lifetime[14]
Now listening on: https://0.0.0.0:5001
info: Microsoft.Hosting.Lifetime[0]
Application started. Press Ctrl+C to shut down.
info: Microsoft.Hosting.Lifetime[0]
Hosting environment: Development
Uruchom okno przeglądarki i przejdź pod adres https://localhost:5001. Wybierz link tutaj u góry, aby zalogować się przy użyciu usługi GitHub.
Zostanie wyświetlony monit o autoryzowanie dostępu aplikacji do czatu na koncie usługi GitHub. Wybierz przycisk Autoryzuj.
Nastąpi przekierowanie z powrotem do aplikacji czatu i zalogowanie się przy użyciu nazwy konta usługi GitHub. Aplikacja internetowa określiła nazwę konta, uwierzytelniając Cię przy użyciu nowego dodanego uwierzytelniania.
Gdy aplikacja do czatu wykonuje teraz uwierzytelnianie za pomocą usługi GitHub i przechowuje informacje uwierzytelniania jako pliki cookie, następnym krokiem jest wdrożenie go na platformie Azure.
Takie podejście umożliwia innym użytkownikom uwierzytelnianie przy użyciu odpowiednich kont i komunikowanie się z różnych stacji roboczych.
Wdrażanie aplikacji na platformie Azure
Przygotuj środowisko dla interfejsu wiersza polecenia platformy Azure:
Jeśli wolisz uruchamiać polecenia referencyjne interfejsu wiersza polecenia lokalnie, zainstaluj interfejs wiersza polecenia platformy Azure. Jeśli korzystasz z systemu Windows lub macOS, rozważ uruchomienie interfejsu wiersza polecenia platformy Azure w kontenerze Docker. Aby uzyskać więcej informacji, zobacz Jak uruchomić interfejs wiersza polecenia platformy Azure w kontenerze platformy Docker.
Jeśli korzystasz z instalacji lokalnej, zaloguj się do interfejsu wiersza polecenia platformy Azure za pomocą polecenia az login. Aby ukończyć proces uwierzytelniania, wykonaj kroki wyświetlane w terminalu. Aby uzyskać inne opcje logowania, zobacz Logowanie się przy użyciu interfejsu wiersza polecenia platformy Azure.
Uruchom polecenie az version, aby znaleźć zainstalowane wersje i biblioteki zależne. Aby uaktualnić do najnowszej wersji, uruchom polecenie az upgrade.
W tej sekcji użyjesz interfejsu wiersza polecenia platformy Azure, aby utworzyć nową aplikację internetową w usłudze aplikacja systemu Azure w celu hostowania aplikacji ASP.NET na platformie Azure. Aplikacja internetowa jest skonfigurowana do korzystania z lokalnego wdrożenia usługi Git. Aplikacja internetowa jest również skonfigurowana przy użyciu parametry połączenia SignalR, wpisów tajnych aplikacji OAuth usługi GitHub i użytkownika wdrożenia.
Podczas tworzenia poniższych zasobów upewnij się, że jest używana ta sama grupa zasobów, w której znajdują się zasoby usługi SignalR Service. To podejście znacznie ułatwia czyszczenie później, gdy chcesz usunąć wszystkie zasoby. W podanych przykładach założono, że użyto nazwy grupy zalecanej w poprzednich samouczkach — SignalRTestResources.
Tworzenie aplikacji internetowej i planu
Skopiuj poniższy tekst poleceń i zaktualizuj parametry. Wklej zaktualizowany skrypt do usługi Azure Cloud Shell, a następnie naciśnij klawisz Enter, aby utworzyć nowy plan usługi App Service i nową aplikację internetową.
Azure CLI
#========================================================================#=== Update these variable for your resource group name. ===#========================================================================
ResourceGroupName=SignalRTestResources
#========================================================================#=== Update these variable for your web app. ===#========================================================================
WebAppName=myWebAppName
WebAppPlan=myAppServicePlanName
# Create an App Service plan.az appservice plan create --name$WebAppPlan--resource-group$ResourceGroupName \
--sku FREE
# Create the new Web Appaz webapp create --name$WebAppName--resource-group$ResourceGroupName \
--plan$WebAppPlan
Parametr
Opis
ResourceGroupName
Ta nazwa grupy zasobów została zasugerowana w poprzednich samouczkach. Warto zachować wszystkie zasoby samouczka pogrupowane razem. Użyj tej samej grupy zasobów co w poprzednich samouczkach.
WebAppPlan
Wprowadź nową, unikatową nazwę planu usługi App Service.
WebAppName
Ten parametr jest nazwą nowej aplikacji internetowej i częścią adresu URL. Utwórz ją unikatową. Na przykład signalrtestwebapp22665120.
Dodawanie ustawień aplikacji do aplikacji internetowej
W tej sekcji dodasz ustawienia aplikacji dla następujących składników:
Parametry połączenia zasobów usługi SignalR Service
Skopiuj poniższy tekst poleceń i zaktualizuj parametry. Wklej zaktualizowany skrypt do usługi Azure Cloud Shell, a następnie naciśnij klawisz Enter, aby dodać ustawienia aplikacji:
Azure CLI
#========================================================================#=== Update these variables for your GitHub OAuth App. ===#========================================================================
GitHubClientId=1234567890
GitHubClientSecret=1234567890#========================================================================#=== Update these variables for your resources. ===#========================================================================
ResourceGroupName=SignalRTestResources
SignalRServiceResource=mySignalRresourcename
WebAppName=myWebAppName
# Get the SignalR primary connection string
primaryConnectionString=$(az signalr key list --name$SignalRServiceResource \
--resource-group$ResourceGroupName--query primaryConnectionString -o tsv)
#Add an app setting to the web app for the SignalR connectionaz webapp config appsettings set --name$WebAppName \
--resource-group$ResourceGroupName \
--settings"Azure__SignalR__ConnectionString=$primaryConnectionString"#Add the app settings to use with GitHub authenticationaz webapp config appsettings set --name$WebAppName \
--resource-group$ResourceGroupName \
--settings"GitHubClientId=$GitHubClientId"az webapp config appsettings set --name$WebAppName \
--resource-group$ResourceGroupName \
--settings"GitHubClientSecret=$GitHubClientSecret"
Parametr
Opis
GitHubClientId
Przypisz tę zmienną tajny identyfikator klienta dla aplikacji OAuth usługi GitHub.
GitHubClientSecret
Przypisz tej zmiennej tajne hasło Twojej aplikacji OAuth usługi GitHub.
ResourceGroupName
Zaktualizuj tę zmienną, aby miała tę samą nazwę grupy zasobów, która została użyta w poprzedniej sekcji.
SignalRServiceResource
Zaktualizuj tę zmienną za pomocą nazwy zasobu usługi SignalR Service, który został utworzony w poradniku Szybki start. Na przykład signalrtestsvc48778624.
WebAppName
Zaktualizuj tę zmienną za pomocą nazwy nowej aplikacji internetowej, która została utworzona w poprzedniej sekcji.
Konfigurowanie aplikacji internetowej na potrzeby lokalnego wdrożenia usługi Git
W usłudze Azure Cloud Shell wklej poniższy skrypt. Ten skrypt tworzy nową nazwę użytkownika wdrożenia i hasło używane podczas wdrażania kodu w aplikacji internetowej za pomocą usługi Git. Skrypt skonfiguruje również aplikację internetową do wdrożenia za pomocą lokalnego repozytorium Git i zwróci adres URL wdrożenia Git.
Azure CLI
#========================================================================#=== Update these variables for your resources. ===#========================================================================
ResourceGroupName=SignalRTestResources
WebAppName=myWebAppName
#========================================================================#=== Update these variables for your deployment user. ===#========================================================================
DeploymentUserName=myUserName
DeploymentUserPassword=myPassword
# Add the desired deployment user name and passwordaz webapp deployment user set --user-name$DeploymentUserName \
--password$DeploymentUserPassword# Configure Git deployment and note the deployment URL in the outputaz webapp deployment source config-local-git --name$WebAppName \
--resource-group$ResourceGroupName \
--query[url]-o tsv
Parametr
Opis
DeploymentUserName
Wybierz nową nazwę użytkownika wdrożenia.
DeploymentUserPassword
Wybierz hasło dla nowego użytkownika wdrożenia.
ResourceGroupName
Użyj tej samej nazwy grupy zasobów, która została użyta w poprzedniej sekcji.
WebAppName
Ten parametr jest nazwą utworzonej wcześniej nowej aplikacji internetowej.
Zanotuj adres URL wdrożenia Git zwracany przez to polecenie. Użyjesz tego adresu URL później.
Wdrażanie kodu w aplikacji internetowej platformy Azure
Aby wdrożyć swój kod, należy wykonać następujące polecenia w powłoce Git.
Przejdź do katalogu głównego katalogu projektu. Jeśli nie masz projektu zainicjowanego za pomocą repozytorium Git, wykonaj następujące polecenie:
Bash
git init
Dodaj zdalne repozytorium dla zanotowanego wcześniej adresu URL wdrożenia Git:
Bash
git remote add Azure <your git deployment url>
Umieść wszystkie pliki w lokalizacji przejściowej w zainicjowanym repozytorium, a następnie dodaj zatwierdzenie.
Bash
git add -A
git commit -m "init commit"
Wdróż swój kod w aplikacji internetowej na platformie Azure.
Bash
git push Azure main
Zostanie wyświetlony monit o uwierzytelnienie w celu wdrożenia kodu na platformie Azure. Wprowadź nazwę i hasło użytkownika wdrożenia utworzone powyżej.
Aktualizowanie aplikacji OAuth usługi GitHub
Ostatnim zadaniem, które należy wykonać, jest aktualizacja adresu URL strony głównej i adresu URL wywołania zwrotnego autoryzacji aplikacji OAuth usługi GitHub, aby wskazywał nową hostowaną aplikację.
Otwórz witrynę https://github.com w przeglądarce i przejdź do pozycji Settings>Developer settings>Oauth Apps (Ustawienia > Ustawienia dewelopera > Aplikacje Oauth) swojego konta.
Wybierz aplikację uwierzytelniania i zaktualizuj adres URL strony głównej i adres URL wywołania zwrotnego autoryzacji, jak pokazano poniżej:
Przejdź do adresu URL swojej aplikacji internetowej i przetestuj aplikację.
Czyszczenie zasobów
Jeśli przejdziesz do następnego samouczka, możesz zachować zasoby utworzone w tym przewodniku Szybki start i użyć ich ponownie w następnym samouczku.
W przeciwnym razie, jeśli skończysz z przykładową aplikacją Szybkiego startu, możesz usunąć zasoby platformy Azure utworzone w tym przewodniku Szybki start, aby uniknąć naliczania opłat.
Ważne
Usunięcie grupy zasobów jest nieodwracalne i grupa zasobów oraz wszystkie zawarte w niej zasoby zostaną trwale usunięte. Uważaj, aby nie usunąć przypadkowo niewłaściwych zasobów lub grupy zasobów. Jeśli zasoby do hostowania tego przykładu zostały utworzone wewnątrz istniejącej grupy zasobów zawierającej zasoby, które chcesz zachować, możesz usunąć każdy zasób oddzielnie z odpowiadającego mu bloku zamiast usuwać całą grupę zasobów.
Zaloguj się do witryny Azure Portal i wybierz pozycję Grupy zasobów.
W polu tekstowym Filtruj według nazwy... wpisz nazwę grupy zasobów. Instrukcje w tym artykule używają grupy zasobów o nazwie SignalRTestResources. Dla grupy zasobów na liście wyników kliknij pozycję ..., a następnie kliknij pozycję Usuń grupę zasobów.
Zobaczysz prośbę o potwierdzenie usunięcia grupy zasobów. Wpisz nazwę grupy zasobów, aby potwierdzić, a następnie wybierz pozycję Usuń.
Po krótkim czasie grupa zasobów i wszystkie zawarte w niej zasoby zostaną usunięte.
Następne kroki
W tym samouczku zostało dodane uwierzytelnianie za pomocą protokołu OAuth w celu zapewnienia lepszego podejścia do uwierzytelniania za pomocą usługi Azure SignalR Service. Aby dowiedzieć się więcej o korzystaniu z serwera Azure SignalR Server, przejdź do przykładów interfejsu wiersza polecenia platformy Azure dla usługi SignalR Service.
Wijzig een updatemechanisme voor JavaScript-web-apps van polling naar realtime push-gebaseerde architectuur met SignalR Service, Azure Cosmos DB en Azure Functions. Gebruik Vue.js en JavaScript om SignalR te gebruiken met Visual Studio Code.
Bouw end-to-end-oplossingen in Microsoft Azure om Azure Functions te maken, web-apps te implementeren en te beheren, oplossingen te ontwikkelen die gebruikmaken van Azure Storage en meer.
Bouw en schaal een realtime web-app eenvoudig in serverloze of servermodus. Gebaseerd op WebSocket met ondersteuning van een groot aantal talen en frameworks.
In dit artikel vindt u een overzicht van verbindingsreeks s in Azure SignalR Service, hoe u er een genereert en hoe u er een configureert in een app-server.