簡體   English   中英

Blazor 服務器與 Signalr - 通過第三方驗證用戶 OAuth

[英]Blazor Server with Signalr - Authenticating user via third-party OAuth

我正在開發一個 Blazor 服務器應用程序,該應用程序通過 Spotify 通過第三方 OAuth 進行身份驗證。

services.AddAuthentication()
    .AddSpotify(options =>
    {
        options.ClientId = config.Spotify.ClientId;
        options.ClientSecret = config.Spotify.ClientSecret;

用戶能夠正確登錄並創建帳戶。 我已將其配置為保存 spotify access_token 以供以后使用,因此我可以查詢該用戶的 spotify API。

ExternalLogin.cshtml.cs

await _signInManager.UpdateExternalAuthenticationTokensAsync(info);

現在,除了通過 Blazor 服務器功能使用 SignalR 之外,我還在當前用戶的“前端”頁面上使用 SignalR 客戶端連接到我的服務器。

app.UseEndpoints(endpoints =>
{
    endpoints.MapControllers();
    endpoints.MapBlazorHub();
    endpoints.MapFallbackToPage("/_Host");
    endpoints.MapHub<HostHub>("/hubs/host");
});

因此,當用戶導航到Hub.razor中需要服務器的頁面時:

@inject HubConnectionProvider HubProvider

    public async Task StartHub()
    {
        try
        {
            Hub = HubProvider.GetHostHub();
            Hub.On<TrackStatus>(nameof(ISpotiFollowerContract.SetTrack), SetTrack);
            await Hub.StartAsync();

            await JoinGroupAsync();
...

//HubConnectionProvider.cs
    public HubConnection GetHostHub()
    {
        string baseUrl = _navMan.BaseUri;
        var hubUrl = baseUrl.TrimEnd('/') + "/hubs/host";
        return new HubConnectionBuilder()
            .WithUrl(hubUrl, options =>
            {
                //my question lies here
                options.AccessTokenProvider = () => Task.FromResult(_currentUserService.GetAccessToken());
            })
            .Build();
    }

我遇到的問題是,即使用戶通過了 Blazor 應用程序的身份驗證,我也無法在我的HostHub.cs中通過身份驗證來獲取用戶:

        public async Task JoinGroup(string userId)
        {
            //Name comes through as null, Identity has no claims, etc.
            var name = Context.User.Identity.Name;

我嘗試為HubConnectionBuilder > options.AccessTokenProvider提供一個值,但我不確定應該提供哪個訪問代碼。 由於我通過第三方令牌對我的用戶進行身份驗證,我應該提供我為用戶存儲的 Spotify access_token,還是應該為的應用程序生成一個令牌,我發送該令牌以對我的HostHub我的用戶進行身份驗證連接到?

我已經嘗試發送 Spotify 訪問令牌,但仍然沒有對我的用戶提出任何要求。 我需要做些什么來允許我的應用基於此令牌進行身份驗證嗎? 我已經嘗試為我的應用程序為已經登錄的用戶生成訪問令牌,但還沒有找到這樣做的方法。 如果這是我需要做的,我該如何生成這個令牌?

我將它與針對 Identity Server 4 或 AzureAD 進行身份驗證的集線器一起使用。

hubConnection = new HubConnectionBuilder()
    .WithUrl(uri, options => {
        options.AccessTokenProvider = async () => {
            var accessTokenResult = await accessTokenProvider.RequestAccessToken();
            accessTokenResult.TryGetToken(out var accessToken);
            var token = accessToken.Value;
            return token;
        };                    
    })
    .WithAutomaticReconnect()
    .Build();

services.AddAuthentication()
    .AddMicrosoftAccount(options =>
    {
        options.ClientId = microsoftAccount.ClientId;
        options.ClientSecret = microsoftAccount.ClientSecret;
        options.SignInScheme = microsoftAccount.SignInScheme;
    });
[Authorize]
public class MessageServiceHub : Hub
{
    ...

您需要將Authorize屬性添加到集線器。

Blazor 服務器應用程序主要是服務器端 ASP.NET 核心應用程序,並使用相同的身份驗證機制。 SingalR 的行為方式與任何其他 ASP.NET 核心應用程序的行為方式相同。 ASP.NET Core SignalR 文檔頁面中的身份驗證和授權中授權用戶訪問集線器和集線器方法部分解釋說:

默認情況下,集線器中的所有方法都可以由未經身份驗證的用戶調用。 要要求身份驗證,請將 Authorize 屬性應用於集線器

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM