我有一个SPA,我在其中提供给img
标签一个图像URL,该URL是Web api端点的URL,以进行身份验证并发送重新调整大小的图像。
我在asp.net中使用 OAuth Toke身份验证进行身份验证,但是只要我无法通过Authorization
标头发送令牌(因为我必须使用{{ src
标签的1}}属性)我正在设置SPA的cookie中的令牌,以在浏览器请求img
值(URL)时自动发送。
我遇到的问题是我的SPA位于与Web API所在的域不同的域上,我该怎么做才能允许随img请求一起发送cookie?
我尝试在服务器上设置一些标头,例如:
src
没有任何效果。
最后,我尝试将所有这些标头放入我创建的Access-Control-Allow-Credentials
Access-Control-Allow-Origin
Access-Control-Allow-Methods
Access-Control-Allow-Headers
中,以便可以在请求进入身份验证管道之前捕获请求,然后在其中搜索令牌值并进行设置到ApplicationOAuthBearerAuthenticationProvider
并继续前进。
这是我的身份验证提供者:
context.Token
在启动时,我会这样使用它(在 public class ApplicationOAuthBearerAuthenticationProvider : OAuthBearerAuthenticationProvider
{
public override Task RequestToken(OAuthRequestTokenContext context)
{
if (context == null) throw new ArgumentNullException("context");
string credsKey = "Access-Control-Allow-Credentials";
if (!context.Response.Headers.Any(a => a.Key.Equals(credsKey)))
context.Response.Headers.Add(credsKey, new[] { "true" });
string allowOrigin = "Access-Control-Allow-Origin";
if (!context.Response.Headers.Any(a => a.Key.Equals(allowOrigin)))
context.Response.Headers.Add(allowOrigin, new[] { "*" });
string allowMethods = "Access-Control-Allow-Methods";
if (!context.Response.Headers.Any(a => a.Key.Equals(allowMethods)))
context.Response.Headers.Add(allowMethods, new[] { "*" });
string allowHeaders = "Access-Control-Allow-Headers";
if (!context.Response.Headers.Any(a => a.Key.Equals(allowHeaders)))
context.Response.Headers.Add(allowHeaders, new[] { "*" });
// try to find bearer token in a cookie
// (by default OAuthBearerAuthenticationHandler
// only checks Authorization header)
if (context.Request.Headers.ContainsKey("Authorization"))
{
context.Token = context.Request.Headers["Authorization"].Replace("Bearer ", string.Empty);
}
else
{
var tokenCookie = context.OwinContext.Request.Cookies["ut"];
if (!string.IsNullOrEmpty(tokenCookie))
context.Token = tokenCookie;
}
return Task.FromResult<object>(null);
}
}
方法内部):
Configuration