我有一个使用ASP.NET Core的GRPC服务器作为Windows服务运行.我还有一个以受限用户身份运行的GRPC客户端.如果我以管理员身份运行GRPC客户端,他们可以很好地通信.当我以非管理员身份运行它时,我收到以下错误:
System.Net.Http.HttpRequestException:对路径的访问被拒绝.(本地主机:80)
这是一个权限问题.根据这个堆栈溢出问题Change Named Pipe Access Permissions,如果我使用原始命名管道,我可以在创建NamedPipeServerStream时更改权限.
GRPC对命名管道的使用不那么直接.
builder.WebHost.ConfigureKestrel(serverOption =>
{
serverOption.ListenNamedPipe(HelloWorldInfo.gRpcPipeName,
listenOptions =>
{
listenOptions.Protocols = HttpProtocols.Http2;
});
});
builder.Services.AddGrpc();
有没有办法将Kestrel配置为将DACL添加到命名管道中,以便受限用户可以通信?
第二种 Select 是在服务器启动后获取命名管道,并添加DACL.但NamedPipes已经可以处理这种配置.这只是一个如何实现的问题.
我try 在配置Kestrel时设置PipeSecurity,如下所示.
var pipeSecurity = CreateSystemIOPipeSecurity();
builder.WebHost.UseNamedPipes(opts =>
{
opts.PipeSecurity = pipeSecurity;
opts.CurrentUserOnly = false;
});
但我得到了
System.IO.IO异常:未能绑定到已在使用的地址http://pipe:/HelloWorldPipe:地址.