【发布时间】:2021-07-24 01:06:04
【问题描述】:
我正在开发一个 blazor wasm 应用程序,并希望在 WebApi(不同的基本 url)上进行身份验证。我的问题是 blazor HttpClient 不尊重服务器发送的 cookie。你有任何提示/想法如何解决这个问题?
在下面的代码中,我试图附加我通过第一个请求从服务器获得的 cookie(成功身份验证)
Porgram.cs
public static async Task Main(string[] args)
{
var builder = WebAssemblyHostBuilder.CreateDefault(args);
builder.RootComponents.Add<App>("#app");
builder.Services.AddScoped<CustomDelegatingHandler>();
builder.Services.AddHttpClient("ServerAPI", client => client.BaseAddress = new Uri("https://test.myserver.com")).AddHttpMessageHandler<CustomDelegatingHandler>();
builder.Services.AddScoped<IHttpService, HttpService>();
builder.Services.AddScoped<ILoginService, LoginService>();
builder.Services.AddScoped<ISuncenterService, SuncenterService>();
await builder.Build().RunAsync();
}
CustomDelegatingHandler.cs 看起来像这样
private readonly IJSRuntime JSRuntime;
public CustomDelegatingHandler(IJSRuntime jSRuntime) : base()
{
JSRuntime = jSRuntime;
}
protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
{
const string prm = "cookie";
string cookie = await JSRuntime.InvokeAsync<string>("blazorExtensions.GetCookie", new[] { prm
});
Console.WriteLine($"{prm}: {cookie}");
request.Headers.Add(prm, cookie);
return await base.SendAsync(request, cancellationToken);
}
【问题讨论】:
-
你找到解决这个问题的方法了吗?
-
是的。最终的 CustomDelegatingHandler.cs 看起来像这样: public class CustomDelegatingHandler : DelegatingHandler { protected override async Task
SendAsync(HttpRequestMessage request, CancellationToken cancelToken) { request.SetBrowserRequestCredentials(BrowserRequestCredentials.Include); return await base.SendAsync(request, cancelToken);我将自定义域添加到我的 heroku 主机(我将它托管在 heroku 上),没有添加自定义域,它仅适用于 Firefox,不适用于 chromium。 -
这个关于 chromium 浏览器的信息也可能有用:blog.heroku.com/chrome-changes-samesite-cookie
-
感谢您的反馈 :) 在我这边,我切换到了 JWT(Json Web Token)解决方案。
标签: blazor