我正在开发一个 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);
}
答案 0 :(得分:0)
您需要在请求中设置 credentials 选项。正如 MDN 链接所解释的,凭据选项控制浏览器是否在跨域请求上发送 cookie - 例如对您的(不同的基本 URL)WebAPI 的请求:
<块引用>Request 接口的凭据只读属性表示 用户代理是否应该从其他域发送 cookie 跨域请求的情况。
对请求执行此操作的 C# 方法是:
request.SetBrowserRequestCredentials(BrowserRequestCredentials.Include);
该选项的三个选项是省略、同源或包含:
<块引用>Omit
建议浏览器永远不要发送凭据(例如 cookie
或 HTTP 身份验证标头)。
SameOrigin
建议浏览器发送凭据(例如 cookie
或 HTTP 身份验证标头)仅当目标 URL 与
调用应用程序。
Include
建议浏览器发送凭据(例如 cookie 或
HTTP 身份验证标头),即使对于跨域请求也是如此。