我有一个 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 时,它完全是空的。