HttpClient 在 Blazor Web assembly 应用程序中的请求中不包含 cookie

2024-01-08

我有一个 Blazor Web assembly 应用程序,其中包含一个用户服务,旨在访问 API 来检索用户的详细信息。该服务如下所示:

public class UserDataService : IUserDataService
{
    public readonly HttpClient _HttpClient;

    public UserDataService(HttpClient httpClientDI)
    {
        _HttpClient = httpClientDI;
    }

    public async Task<User> GetUserInfo()
    {
        try
        {
            return await _HttpClient.GetFromJsonAsync<User>("api/users/MyUserInfo");
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex.Message);
            throw;
        }
    }
}

该 API 专门设计用于从客户端请求中读取加密的 cookie。该 cookie 包含用户的电子邮件地址,用户信息服务使用它来检索更详细的用户信息集。

[HttpGet("MyUserInfo")]
public User MyUserInfo()
{
    var myCookie = HttpContext.Request.Cookies.FirstOrDefault(c => c.Key == "MyCookie");

    var userMask = JsonConvert.DeserializeObject<AuthUserMask>(Protector.Unprotect(myCookie.Value));

    var user = UserService.Find(userMask.Email).FirstOrDefault();

    return user;
}

当我运行 Web 应用程序时,我能够验证浏览器中是否存在 cookie,但是当应用程序向 API 发出请求时,不包含 cookie。事实上,该请求根本不包含来自客户端的任何 cookie。

我对 Blazor 完全陌生,我不确定这种情况是否存在任何约定,但目前我只是想让这个新的 Web 应用程序与我们现有的服务一起使用。有没有办法确保 cookie 包含在内?我可能做错了什么?

先谢谢您的帮助。

EDIT

这是创建 cookie 的代码。它是验证用户是否经过身份验证的更大方法的一部分,但这是相关部分:

{
    var userJson = JsonConvert.SerializeObject(new AuthUserMask()
    {
        Email = user.Email,
        isActive = user.IsActive
    });

    var protectedContents = Protector.Protect(userJson);

    HttpContext.Response.Cookies.Append("MyCookie", protectedContents, new CookieOptions()
    {
        SameSite = SameSiteMode.None,
        Secure = true,
        Path = "/",
        Expires = DateTime.Now.AddMinutes(60)
    });

    HttpContext.Response.Redirect(returnUrl);
}

EDIT 2

在 UserDataService 中尝试以下操作,看看会发生什么:

public async Task<User> GetUserInfo()
{
    try
    {
        _HttpClient.DefaultRequestHeaders.Add("Test", "ABC123");
        return await _HttpClient.GetFromJsonAsync<User>("api/users/MyUserInfo");
    }
    catch (Exception ex)
    {
        Console.WriteLine(ex.Message);
        throw;
    }
}

不幸的是,结果是一样的——当 RequestCookieCollection 访问 API 时,它完全是空的。


在 Program.cs 中使用 Blazor .net 6 样式,您需要以下代码:

builder.Services
    .AddTransient<CookieHandler>()
    .AddScoped(sp => sp
        .GetRequiredService<IHttpClientFactory>()
        .CreateClient("API"))
    .AddHttpClient("API", client => client.BaseAddress = new Uri(apiAddress)).AddHttpMessageHandler<CookieHandler>();

那么你需要 @murat_yuceer 描述的处理程序,例如:

namespace Client.Extensions
{
    public class CookieHandler : DelegatingHandler
    {
        protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
        {
            request.SetBrowserRequestCredentials(BrowserRequestCredentials.Include);

            return await base.SendAsync(request, cancellationToken);
        }
    }
}

您不需要(也不应该)指定 cookie。 正确的 cookie 将会发送给您,只需添加BrowserRequestCredentials.Include在消息中。

在拥有 API 的服务器端,您需要设置 CORS 允许凭据。

使用 .net 6 语法,您应该已经在程序.cs:

app.UseCors(x => x.
  .AllowAnyHeader()
  .AllowAnyMethod()
  .AllowAnyOrigin()
);

但你还需要AllowCredentials()

如果你添加AllowCredentials您会收到以下运行时错误:

System.InvalidOperationException: 'The CORS protocol does not allow specifying a wildcard (any) origin and credentials at the same time. Configure the CORS policy by listing individual origins if credentials needs to be supported.'

因此,您需要指定允许的来源,或像这样的通配符:

app.UseCors(x => x
    .AllowAnyHeader()
    .AllowAnyMethod()
    //.AllowAnyOrigin()
    .SetIsOriginAllowed(origin => true)
    .AllowCredentials()
);

现在一切都应该按预期进行。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

HttpClient 在 Blazor Web assembly 应用程序中的请求中不包含 cookie 的相关文章

  • C# 方法重载决策不选择具体的泛型覆盖

    这个完整的 C 程序说明了这个问题 public abstract class Executor
  • 使用 CMake 时如何导出 Emscripten 中的 C 函数

    In 本教程 https emscripten org docs porting connecting cpp and javascript Interacting with code html interacting with code
  • 在 CPP 类中将 C 函数声明为友元

    我需要在 C 函数中使用类的私有变量 我正在做这样的事情 class Helper private std string name public std getName return name friend extern C void in
  • Environment.CurrentDirectory 与 System.IO.Directory.GetCurrentDirectory

    我正在编写一个 Net WinForms 并不断在调试和发布配置之间切换 并且有一些文件我需要任一配置才能访问 我想做的是将文件放在 BIN 文件夹中的公共目录中 这样它看起来像这样 MyProject Bin CommonFiles My
  • 如何在类文件中使用 Url.Action() ?

    如何在 MVC 项目的类文件中使用 Url Action Like namespace 3harf public class myFunction public static void CheckUserAdminPanelPermissi
  • 未找到 Boost 库,但编译正常

    我正在尝试在 C 中使用 boost 的文件系统 使用时看起来编译没问题 c c Analyse c o Analyse o g W Wall L usr local lib lboost filesystem lboost system
  • 如何将 SOLID 原则应用到现有项目中

    我对这个问题的主观性表示歉意 但我有点卡住了 我希望之前处理过这个问题的人能够提供一些指导和建议 我有 现在已经成为 一个用 C 2 0 编写的非常大的 RESTful API 项目 并且我的一些类已经变得巨大 我的主要 API 类就是一个
  • ASP.NET 5 中的全局异常处理

    如何将自己的日志记录逻辑附加到 ASP NET 5 应用程序以处理业务逻辑和较低层中引发的每个异常 我尝试用自己的ILoggerProvider实施和loggerfactory AddProvider new LoggerProvider
  • 如何在 C# Designer.cs 代码中使用常量字符串?

    如何在 designer cs 文件中引用常量字符串 一个直接的答案是在我的 cs 文件中创建一个私有字符串变量 然后编辑 Designer cs 文件以使用此变量 而不是对字符串进行硬编码 但设计者不喜欢这样抛出错误 我明白为什么这行不通
  • 获取没有显式特征的整数模板参数的有符号/无符号变体

    我希望定义一个模板类 其模板参数始终是整数类型 该类将包含两个成员 其中之一是类型T 另一个作为类型的无符号变体T 即如果T int then T Unsigned unsigned int 我的第一直觉是这样做 template
  • C++中判断unicode字符是全角还是半角

    我正在编写一个终端 控制台 应用程序 该应用程序应该包装任意 unicode 文本 终端通常使用等宽 固定宽度 字体 因此要换行文本 只需计算字符数并观察单词是否适合一行并采取相应的操作 问题是 Unicode 表中的全角字符在终端中占用了
  • 在 C# 中检查 PowerShell 执行策略的最佳方法是什么?

    当你跑步时Get ExecutionPolicy在 PowerShell 中 它得到有效的执行政策 https learn microsoft com en us powershell module microsoft powershell
  • 在 VS 中运行时如何查看 C# 控制台程序的输出?

    我刚刚编写了一个名为 helloworld 的聪明程序 它是一个 C NET 4 5 控制台应用程序 在扭曲的嵌套逻辑迷宫深处 使用了 Console WriteLine 当我在命令行运行它时 它会运行并且我会看到输出 我可以执行其他命令并
  • 如果输入被重定向则执行操作

    我想知道如果我的输入被重定向 我应该如何在 C 程序中执行操作 例如 假设我有已编译的程序 prog 并且我将输入 input txt 重定向到它 我这样做 prog lt input txt 我如何在代码中检测到这一点 一般来说 您无法判
  • 将二变量 std::function 转换为单变量 std::function

    我有一个函数 它获取两个值 x 和 y 并返回结果 std function lt double double double gt mult double x double y return x y 现在我想得到一个常量 y 的单变量函数
  • 如何解压 msgpack 文件?

    我正在将 msgpack 编码的数据写入文件 在编写时 我只是使用 C API 的 fbuffer 如 我为示例删除了所有错误处理 FILE fp fopen filename ab msgpack packer pk msgpack pa
  • Visual Studio 2015 - Web 项目上缺少共享项目参考选项卡

    我从 MSDN 订阅升级到 Visual Studio 2015 因为我非常兴奋地阅读有关共享项目的信息 当我们想要做的只是重用代码时 不再需要在依赖项中管理 21382 个 nuget 包 所以我构建了一个测试共享项目 其中包含一些代码
  • 了解 Lambda 表达式和委托 [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我已经尝试解决这个问题很长一段时间了 阅读在线博客和文章 但到目前为止还没有成功 什么是代表 什么是 Lambda 表达式 两者的优点
  • 如何在 sql azure 上运行 aspnet_regsql? [复制]

    这个问题在这里已经有答案了 可能的重复 将 ASP NET 成员资格数据库迁移到 SQL Azure https stackoverflow com questions 10140774 migrating asp net membersh
  • 为什么空循环使用如此多的处理器时间?

    如果我的代码中有一个空的 while 循环 例如 while true 它将把处理器的使用率提高到大约 25 但是 如果我执行以下操作 while true Sleep 1 它只会使用大约1 那么这是为什么呢 更新 感谢所有精彩的回复 但我

随机推荐

  • 派生类被视为友元吗?

    如果我创建基类 A 并且 A 是类 B 的友元 那么从 A 派生的类可以按照自己的喜好访问 B 吗 否则允许什么 Thanks struct A struct Ader A struct B friend struct A 不 C 中的友谊
  • 如何在 pom.xml 中覆盖父级插件?

    我的 pom xml 中有这样的内容
  • 允许 postgres 用户只列出自己的数据库

    我正在使用 postgresql 服务器 我想禁止我的用户查看同一服务器上的其他数据库 本质上是一个 l应该只列出他自己的数据库 我很确定我需要从用户那里撤销一项权利 但我在文档中找不到它 这似乎有效 但可能会产生不可预见的后果 它需要修改
  • 在 PHP 上使用 Curl 发送空 字段

    欢迎大家 这是我遇到的一个问题 我正在尝试使用 PHP 和 CURL 将数据和文件发送到服务器 服务器接受包含 6 张照片的数据 如果 FILES 数组中的项目少于 6 个 这是一个错误 因此 如果我发送所有 6 张照片 一切都会很顺利 但
  • 从字符串动态创建 xml

    这是正确的程序 现在运行良好 谢谢先生 我是安卓新手 我有一个字符串 其中包含服务器返回给我的 XML 格式数据 它是一个 XML 文档 我想在Android中解析它XmlResourceParser但它只接受存储在您设备上的 xml 文档
  • C# ListView 平铺宽度 100%?

    我有一个 ListView 设置为 Tileview ListView 宽度为 300 平铺宽度也是如此 当图块数量没有溢出导致滚动条时 此方法可以正常工作 然而 当它确实溢出时 当出现垂直滚动条时 也会出现水平滚动条 因为垂直滚动条降低了
  • 在无序列表中动态设置排序

    好的 这就是我现在面临的问题 我有一个动态生成的无序列表 最初编写代码的人将 UL 设置为可通过列表项进行排序 即您可以切换列表中的 1 和 2 等 该代码看起来有点像这样 ulFeatures sortable update functi
  • 如何获取该字符串中标签的 href 属性?

    在这个字符串中存在数字 li 标签 我想获取标签的 href 属性 如下所示 http bipardeh94 blogfa com target blank http avaejam blogfa com target blank 和 我想
  • 在 Python 中访问 GPU 硬件规格?

    我想使用 Numba 或类似的 Python CUDA 包访问各种 NVidia GPU 规范 可用设备内存 二级缓存大小 内存时钟频率等信息 来自阅读这个问题 https stackoverflow com questions 48654
  • 重启Kubernetes集群后RabbitMQ启动失败

    我在 Kubernetes 上运行 RabbitMQ 这是我的 sts YAML 文件 apiVersion v1 kind Service metadata name rabbitmq management labels app rabb
  • python float 格式奇怪吗?

    我正在尝试调试两个执行非常相似代码的不同 python 脚本 这些脚本设置a 这是一个简单的浮点数 对于脚本 1 ipdb gt print sys version 2 7 r27 82500 Jul 15 2010 13 04 38 GC
  • Amazon S3 的访问被拒绝错误

    我在使用 Amazon S3 时遇到 访问被拒绝 错误 但无法找出原因 我的设置如下 STATIC URL http s3 amazonaws com s AWS STORAGE BUCKET NAME 什么会导致访问被拒绝错误 我已经验证
  • Masonry 的 CSS 系统替代方案

    我记得有一个 CSS 网格系统可以替代 Masonry Vanilla http masonry desandro com http masonry desandro com 该网站是黑色背景并显示 排列彩色框 元素周期表元素 它还具有基于
  • 为什么 include Guard 不让循环 #include 起作用?

    我有三门课 GameEvents Physics and GameObject 我有每个人的标题 GameEvents有一个Physics和一个列表GameObjects Physics有一个列表GameObjects 注意循环依赖 我正在
  • While 与 Do While

    Merged https meta stackexchange com questions 158066 what is a merged question with 测试循环在顶部还是底部 while 与 do while 关闭 ques
  • 现代芯片上的浮点与整数运算性能

    考虑加法模型上的维特比解码器 它花时间进行添加和比较 现在 考虑两种 一种是 C C float作为数据类型 另一个与int 在现代芯片上 你会期望int跑得比float 或者管道的奇迹 以及没有乘法和除法 会让一切变得均匀吗 取决于你的意
  • Cobertura“无法找到文件”问题

    谁能帮我理解这里出了什么问题吗 我正在使用 Cobertura 1 9 4 1 进行 Java 代码覆盖 我想附加带有 HTML 报告的源文件 我使用以下命令生成报告 cobertura report sh format html data
  • 如何改变HTML5进度条的颜色

    我有 HTML 进度条 其值动态变化
  • 如何配置EasyMock类扩展3.1?

    我想将 EasyMock 类扩展 3 1 添加到我的项目中 但 EasyMock 3 1 CE 的依赖项存在问题 我添加依赖项 cglib 2 2 2 jar 和 asm 4 0 jar 并引发异常 java lang VerifyErro
  • HttpClient 在 Blazor Web assembly 应用程序中的请求中不包含 cookie

    我有一个 Blazor Web assembly 应用程序 其中包含一个用户服务 旨在访问 API 来检索用户的详细信息 该服务如下所示 public class UserDataService IUserDataService publi