как взять токен из http клиента с сигнализатором в приложении Blazor Server? - PullRequest
1 голос
/ 27 февраля 2020

Я использую SignalR в своем приложении сервера Blazor. Я добавил services.AddSignalR() в файл startup.cs. Тогда я не могу взять токен. Потому что http-контекст - null. Затем я удалил services.AddSignalR() из файла startup.cs. это нормально работает. Тогда я могу взять токен из http клиента. Как это решить?

Спасибо.

Файл Startup.cs:

services
    .AddAuthentication(options =>
    {
        options.DefaultScheme = "Cookies";
        options.DefaultChallengeScheme = "oidc";
    })
    .AddCookie("Cookies")
    .AddOpenIdConnect("oidc", options =>
    {
        options.SignInScheme = CookieAuthenticationDefaults.AuthenticationScheme;
        options.Authority = identityUrl.ToString();
        options.SignedOutRedirectUri = callBackUrl.ToString();
        options.ClientId = useLoadTest ? "mvctest" : "blazor";
        options.ClientSecret = "secret";
        options.ResponseType = useLoadTest ? "code id_token token" : "code id_token";
        options.SaveTokens = true;
        options.GetClaimsFromUserInfoEndpoint = true;
        options.RequireHttpsMetadata = false;
        options.Scope.Add("openid");
        options.Scope.Add("profile");
        options.Scope.Add("post");
        options.Scope.Add("family");
        options.Scope.Add("webpostagg");

    });

services.AddRazorPages();
    services.AddServerSideBlazor();
    services.AddSignalR();

services.AddHttpClient<IPostService, PostService>()                  
    .AddHttpMessageHandler<HttpClientAuthorizationDelegatingHandler>();

HttpClientAuthorizationDelegatingHandler.cs:

public HttpClientAuthorizationDelegatingHandler(IHttpContextAccessor httpContextAccesor)

{
    _httpContextAccesor = httpContextAccesor;
}

protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
{
    string authorizationHeader;
    if (_httpContextAccesor.HttpContext == null)
    {
        authorizationHeader = string.Empty;
    }
    else
    {
        authorizationHeader = _httpContextAccesor.HttpContext
        .Request.Headers["Authorization"];
    }

    if (!string.IsNullOrEmpty(authorizationHeader))
    {
        request.Headers.Add("Authorization", new List<string>() { authorizationHeader });
    }

    var token = await GetToken();

    if (token != null)
    {
        request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", token);
    }

    return await base.SendAsync(request, cancellationToken);
}

public async Task<string> GetToken()
{
    const string ACCESS_TOKEN = "access_token";

    return await _httpContextAccesor.HttpContext
        .GetTokenAsync(ACCESS_TOKEN);
}

1 Ответ

0 голосов
/ 27 февраля 2020

Пожалуйста, не используйте HttpContext в приложении Server Blazor. Это не доступно. Серверная часть Blazor основана на WebSocket, а не на HTTP-запросах. Только не делайте этого.

Вот ссылки на мой ответ о том, как реализовать OpenID Connect, и другие, где вы найдете ответы на свои вопросы.

См. Эти: как jwt аутентифицировать сервер Blazor без удостоверения Microsoft? Как получить токен доступа из веб-приложения Blazor (на стороне сервера)? Как добавить OpenIdConnect через IdentityServer4 в ASP . NET Базовое веб-приложение Core ServerSide Blazor? Как получить аутентифицированного пользователя для входа в JWT из заявлений о личности в asp. net web api Как использовать объект HttpContext в серверной части Blazor для получения информации о пользователе, пользовательский агент Blazor Добавление HttpClientHandler для добавления Jwt в заголовок HTTP по запросам

Blazor: перенаправление на страницу входа при сеанс / токен JWT отсутствует?

Примечание. Есть еще ответы, связанные с Jwt, OpenID Connect и т. д. c. Вы просто должны искать их

...