gpt4 book ai didi

asp.net-web-api - 为 Web Api 2 和 OWIN token 身份验证启用 CORS

转载 作者:行者123 更新时间:2023-12-03 09:49:31 24 4
gpt4 key购买 nike

我有一个 ASP.NET MVC 5 webproject (localhost:81),它使用 Knockoutjs 从我的 WebApi 2 项目 (localhost:82) 调用函数,以在我启用 CORS 的两个项目之间进行通信。到目前为止一切正常,直到我尝试对 WebApi 实现 OWIN token 身份验证。
要在 WebApi 上使用/token 端点,我还需要在端点上启用 CORS,但经过数小时的尝试和搜索解决方案后,它现在仍在工作,并且 api/token 仍然会导致:

XMLHttpRequest cannot load http://localhost:82/token. No 'Access-Control-Allow-Origin' header is present on the requested resource. 

public void Configuration(IAppBuilder app)
{
app.UseCors(Microsoft.Owin.Cors.CorsOptions.AllowAll);
TokenConfig.ConfigureOAuth(app);
...
}
token 配置
public static void ConfigureOAuth(IAppBuilder app)
{
app.CreatePerOwinContext(ApplicationDbContext.Create);
app.CreatePerOwinContext<AppUserManager>(AppUserManager.Create);

OAuthAuthorizationServerOptions OAuthServerOptions = new OAuthAuthorizationServerOptions()
{
AllowInsecureHttp = true,
TokenEndpointPath = new PathString("/token"),
AccessTokenExpireTimeSpan = TimeSpan.FromDays(1),
Provider = new SimpleAuthorizationServerProvider()
};

app.UseOAuthAuthorizationServer(OAuthServerOptions);
app.UseOAuthBearerAuthentication(new OAuthBearerAuthenticationOptions());
}
授权提供者
public override async Task GrantResourceOwnerCredentials(OAuthGrantResourceOwnerCredentialsContext context)
{
context.OwinContext.Response.Headers.Add("Access-Control-Allow-Origin", new[] { "*" });

var appUserManager = context.OwinContext.GetUserManager<AppUserManager>();
IdentityUser user = await appUserManager.FindAsync(context.UserName, context.Password);

if (user == null)
{
context.SetError("invalid_grant", "The user name or password is incorrect.");
return;
}
... claims
}
身份配置
public static AppUserManager Create(IdentityFactoryOptions<AppUserManager> options, IOwinContext context)
{
// Tried to enable it again without success.
//context.Response.Headers.Add("Access-Control-Allow-Origin", new[] {"*"});

var manager = new AppUserManager(new UserStore<AppUser>(context.Get<ApplicationDbContect>()));

...

var dataProtectionProvider = options.DataProtectionProvider;
if (dataProtectionProvider != null)
{
manager.UserTokenProvider =
new DataProtectorTokenProvider<AppUser>(dataProtectionProvider.Create("ASP.NET Identity"));
}
return manager;
}
编辑:
1. 重要提示是直接打开端点(localhost:82/token)是可以的。
2. 从 webproject 调用 Api (localhost:82/api/..) 也可以,因此为 WebApi 启用了 CORS。

最佳答案

我知道您的问题已在评论中解决,但我认为了解导致问题的原因以及如何解决这一类问题很重要。

查看您的代码,我可以看到您正在设置 Access-Control-Allow-Origin token 端点的 header 不止一次:

app.UseCors(Microsoft.Owin.Cors.CorsOptions.AllowAll);

里面 GrantResourceOwnerCredentials方法:
context.OwinContext.Response.Headers.Add("Access-Control-Allow-Origin", new[] { "*" }); 

这个,看着 CORS specifications , 本身就是一个问题,因为:

If the response includes zero or more than one Access-Control-Allow-Origin header values, return fail and terminate this algorithm.



在您的场景中,框架设置此 header 两次,并了解必须如何实现 CORS,这将导致在某些情况下(可能与客户端相关)删除 header 。

以下问题答案也证实了这一点: Duplicate Access-Control-Allow-Origin: * causing COR error?

出于这个原因,将调用转移到 app.UseCors调用 ConfigureOAuth 后允许您的 CORS header 仅设置一次(因为 owin 管道在 OAuth 中间件处中断,并且永远不会到达 Token 端点的 Microsoft CORS 中间件)并使您的 Ajax 调用正常工作。

要获得更好的全局解决方案,您可以尝试再次输入 app.UseCors在 OAuth 中间件调用之前,删除第二个 Access-Control-Allow-Origin插入 GrantResourceOwnerCredentials .

关于asp.net-web-api - 为 Web Api 2 和 OWIN token 身份验证启用 CORS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36285253/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com