【问题标题】:Blazor wasm cookie authenticationBlazor wasm cookie 身份验证
【发布时间】: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


【解决方案1】:

您需要在请求中设置credentials 选项。正如 MDN 链接所解释的,凭据选项控制浏览器是否在跨域请求上发送 cookie - 例如对您的(不同的基本 url)WebAPI 的请求:

Request接口的credentials只读属性表示 用户代理是否应该从其他域发送 cookie 跨域请求的情况。

对请求执行此操作的 C# 方式是:

request.SetBrowserRequestCredentials(BrowserRequestCredentials.Include);

该选项的三个选项是 Omit、SameOrigin 或 Include:

Omit 建议浏览器永远不要发送凭据(例如 cookie 或 HTTP 身份验证标头)。

SameOrigin 建议浏览器发送凭据(例如 cookie 或 HTTP auth 标头)仅当目标 URL 与 调用应用程序。

Include 建议浏览器发送凭据(例如 cookie 或 HTTP auth 标头),即使是跨域请求。

【讨论】:

  • 感谢您的回复。现在我添加了 request.SetBrowserRequestCredentials(BrowserRequestCredentials.Include);到我的 SendAsync 方法中的 CustomDelegatingHandler,但浏览器仍然不发送 cookie
  • 您是在运行调试 HTTP 还是 HTTPS?如果是 http,请确保 cookie 没有设置 Secure 标志(您可以在查看 cookie 时在浏览器开发工具中看到这一点)。如果你已经是 https 了,那我就没主意了。
  • 是的,我已经在 https 上了。感谢您的帮助
猜你喜欢
  • 1970-01-01
  • 2021-11-05
  • 2021-04-30
  • 2020-02-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-28
  • 1970-01-01
相关资源
最近更新 更多