我在asp.net中编写了一个控制器,在登录后附加令牌cookie。当我在浏览器中直接对控制器进行get调用时,cookie被附加,随后可以在请求中读取。饼干。然而,当我使用相同的参数从我的blazor视图页面对相同的控制器进行相同的调用时,控制器中的登录过程仍然有效(表明调用是正确的),但在执行response.cookies.append之后,cookie计数在后续请求读取时仍然为0。
控制器和视图页都从本地主机运行,控制器使用https,视图页使用http。(这些将在未来得到保护,但我正在测试UAT中的功能,并且基本的验证返回仅用于诊断原因,目前以确保编码和解码正常工作)
控制器代码:
[HttpGet("/Login")]
public String Get(String Email, String Pass)
{
String token = null;
token = Auth.Login(Email, Pass);
if (token != null)
{
String basicauth = Convert.ToBase64String(Encoding.ASCII.GetBytes(Email+":"+token));
CookieOptions cookieOptions = new CookieOptions();
cookieOptions.IsEssential = true;
cookieOptions.SameSite = SameSiteMode.Lax;
cookieOptions.Secure = false;
Response.Cookies.Append("bearer",basicauth,cookieOptions);
Console.WriteLine("Cookie count after login: " + Request.Cookies.Count);
return basicauth;
}
return "token was null";
}
的代码测试下面的存储饼干:(从视图页面只返回null,不是为了在浏览器中直接得到调用。Request.cookies.count分别给出类似的1和0响应)
public class ValidateCookieToken : ControllerBase
{
[HttpGet("/ValidateCookie")]
public String Get()
{
String bearertoken;
Console.WriteLine("ValidateCookies current cookie count: " + Request.Cookies.Count);
Console.WriteLine("Validatecookies cookie keys: " + Request.Cookies.Keys);
Request.Cookies.TryGetValue("bearer", out bearertoken);
String decodedbearer = Encoding.ASCII.GetString(Convert.FromBase64String(bearertoken));
return decodedbearer;
}
}
编辑:我现在在我的浏览器端请求中添加了withCredentials:true header,现在在请求的header中显示cookie;然而,响应仍然没有cookie头,即使我已经设置了下面的CORS策略并应用到我的get控制器。
builder.Services.AddCors(options =>
{
options.AddPolicy("CookiePolicy",
policy =>
{
policy.WithOrigins("http://localhost:5196","https://localhost:7139").AllowCredentials().AllowAnyHeader();
});
options.AddPolicy("AnotherPolicy",
policy =>
{
policy.WithOrigins("http://www.contoso.com")
.AllowAnyHeader()
.AllowAnyMethod();
});
});
cookie在默认情况下不会包含在浏览器的跨域请求中,因此您需要显式地允许它。
var requestMessage = new HttpRequestMessage
{
...
};
requestMessage.SetBrowserRequestOption("credentials", "include");
你可以在这里阅读更多关于这个选项- https://developer.mozilla.org/en-US/docs/Web/API/Request/credentials.