gRP C -Аутентификация веб-канала с помощью веб-сборки Blazor через внедрение зависимостей - PullRequest
1 голос
/ 10 апреля 2020

Я тестирую gRP C -Веб-сайт в Blazor Webassembly с аутентификацией и немного попадаю в блок о том, как получить чистый доступ к моему каналу gRP C.

Без аутентификации есть довольно простой и понятный способ, как описано в примере Blazor для grp c -do tnet https://github.com/grpc/grpc-dotnet/tree/master/examples/Blazor.

Предоставление канала:

builder.Services.AddSingleton(services =>
{
    // Get the service address from appsettings.json
    var config = services.GetRequiredService<IConfiguration>();
    var backendUrl = config["BackendUrl"];

    var httpClient = new HttpClient(new GrpcWebHandler(GrpcWebMode.GrpcWebText, new HttpClientHandler()));

    var channel = GrpcChannel.ForAddress(backendUrl, new GrpcChannelOptions { HttpClient = httpClient });

    return channel;
});

Использование в файлах Razor

@inject GrpcChannel Channel

Добавление аутентификации непосредственно в файл бритвы и создание канала там не так либо сложный либо

@inject IAccessTokenProvider AuthenticationService
...

@code {
...
var httpClient = new HttpClient(new GrpcWebHandler(GrpcWebMode.GrpcWebText, new HttpClientHandler()));
var tokenResult = await AuthenticationService.RequestAccessToken();

if (tokenResult.TryGetToken(out var token))
{
    var _token = token.Value;

    var credentials = CallCredentials.FromInterceptor((context, metadata) =>
    {
        if (!string.IsNullOrEmpty(_token))
        {
            metadata.Add("Authorization", $"Bearer {_token}");
        }
        return Task.CompletedTask;
    });

    //SslCredentials is used here because this channel is using TLS.
    //Channels that aren't using TLS should use ChannelCredentials.Insecure instead.
    var channel = GrpcChannel.ForAddress(baseUri, new GrpcChannelOptions
    {
        Credentials = ChannelCredentials.Create(new SslCredentials(), credentials)
    });

Но это перемещает большую часть необходимых логик c в файл бритвы. Есть ли способ объединить их и обеспечить аутентифицированный канал GRP c путем инъекции?

Ответы [ 2 ]

1 голос
/ 20 апреля 2020

После множества дополнительных тестов я нашел решение. Пока он не идеален, но пока работает нормально.

Регистрация канала во время запуска

builder.Services.AddSingleton(async services =>
{
    var httpClient = new HttpClient(new GrpcWebHandler(GrpcWebMode.GrpcWeb, new HttpClientHandler()));
    var baseUri = "serviceUri";

    var authenticationService = services.GetRequiredService<IAccessTokenProvider>();

    var tokenResult = await authenticationService.RequestAccessToken();

    if(tokenResult.TryGetToken(out var token)) {
        var credentials = CallCredentials.FromInterceptor((context, metadata) =>
        {
            if (!string.IsNullOrEmpty(token.Value))
            {
                metadata.Add("Authorization", $"Bearer {token.Value}");
            }
            return Task.CompletedTask;
        });

        var channel = GrpcChannel.ForAddress(baseUri, new GrpcChannelOptions { HttpClient = httpClient, Credentials = ChannelCredentials.Create(new SslCredentials(), credentials) });

        return channel;
    }

    return GrpcChannel.ForAddress(baseUri, new GrpcChannelOptions() { HttpClient = httpClient });

});

Поскольку канал зарегистрирован с использованием asyn c, он должен быть введен как Задача

@inject Task<GrpcChannel> Channel
0 голосов
/ 21 апреля 2020

Я попытался сделать что-то похожее в моем приложении Blazor WASM с примером кода из примера Ticketer от JamesNK по номеру https://github.com/grpc/grpc-dotnet/tree/master/examples#ticketer, и это работает.

В тиккере показано, как использовать gRP C с аутентификацией и авторизацией в ASP. NET Core. В этом примере метод gRP C помечен атрибутом [Authorize]. Клиент может вызывать метод, только если он был аутентифицирован сервером и передает действительный токен JWT с помощью вызова gRP C.

Я создаю токен в «Client / Shared / NavMenu». cs '(OnInitializedAsync()) и использовать этот токен в вызовах gRP C -услуг на других страницах.

...