gpt4 book ai didi

ajax - Ajax中的CORS请求具有IdentityServer3授权的MVC Controller

转载 作者:行者123 更新时间:2023-12-01 03:36:03 26 4
gpt4 key购买 nike

我目前正在使用各种Ajax请求保存,加载和自动完成数据的网站上工作。它是使用C#,MVC和JQuery构建的。 MVC Controller 上的所有操作都需要对用户进行授权,并且我们使用IdentityServer3进行身份验证。它是使用NuGet安装的,当前版本是2.3.0。

当我打开页面并按下按钮时,一切正常。当某个 session 过期时,似乎会出现此问题。如果我空闲一段时间,并尝试使用Ajax函数,它将生成以下错误:

XMLHttpRequest cannot load https://identityserver.domain.com/connect/authorize?client_id=Bar&redirect_uri=http%3a%2f%2flocalhost%3a12345&response_mode=form_post&response_type=id_token+token&scope=openid+profile+email+phone+roles [...]. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost:12345' is therefore not allowed access.



根据我对Ajax的了解,问题本身非常简单。 MVC站点已失去对当前 session 的跟踪,它正在要求客户端再次进行身份验证。我从Ajax请求获得的响应是​​“找到的302”,带有指向我们的IdentityServer的Location-header。 IdentityServer恰好在另一个域上,尽管当您执行常规HTTP请求时这可以很好地工作,但对于Ajax请求它却不能很好地工作。 “相同来源策略”直接阻止了Ajax函数的身份验证。如果刷新页面,我将被重定向到IdentityServer并正常进行身份验证。几分钟后,一切都会恢复正常。

解决方案可能是在IdentityServer的响应消息中添加一个额外的 header ,该 header 明确指出此服务允许跨域请求。

我目前是 而不是,从IdentityServer获取此 header (已在Fiddler中检查)。

According to the docs,默认情况下应启用。我检查了我们是否确实以这种方式启用了CORS:
factory.CorsPolicyService = new Registration<ICorsPolicyService>(new DefaultCorsPolicyService { AllowAll = true });

这是我的客户之一:
new Client
{
Enabled = true,
ClientName = "Foo",
ClientId = "Bar",
ClientSecrets = new List<Secret>
{
new Secret("Cosmic")
},
Flow = Flows.Implicit,
RequireConsent = false,
AllowRememberConsent = true,
AccessTokenType = AccessTokenType.Jwt,
PostLogoutRedirectUris = new List<string>
{
"http://localhost:12345/",
"https://my.domain.com"
},
RedirectUris = new List<string>
{
"http://localhost:12345/",
"https://my.domain.com"
},
AllowAccessToAllScopes = true
}

这些设置不起作用。我注意到这里的URI中有一个额外的正斜杠,但是如果删除它们,则会收到默认的IdentityServer-error,该错误指出客户端未得到授权(错误的URI)。如果部署站点(而不是运行localhost调试),则使用域名时不带斜杠,并且行为与调试中的行为完全相同。我确实注意到上面的错误消息中没有结尾斜杠,并且我认为这可能是问题所在,直到在站点的已部署版本中看到相同的内容为止。

我还创建了自己的策略提供程序,如下所示:
public class MyCorsPolicyService : ICorsPolicyService
{
public Task<bool> IsOriginAllowedAsync(string origin)
{
return Task.FromResult(true);
}
}

...,然后将其插入IdentityServerServiceFactory中,如下所示:
factory.CorsPolicyService = new Registration<ICorsPolicyService>(new MyCorsPolicyService());

这个想法是要使它返回true而不管其起源。这也不起作用。与以前完全相同的结果。

我已经读过关于这个特定主题的其他十几个主题,但是我一无所获。据我所知,对于不同站点的设置,我们没有做任何异常的事情。几乎都是开箱即用的。有什么建议吗?

- - - 更新 - - -

问题仍然存在。我现在尝试了一些新策略。我在某处读到cookie身份验证不利于Ajax请求,而我应该使用不记名 token 。我是这样在Ajax中设置的:
$(function () {
$(document).ajaxSend(function (event, request, settings) {
console.log("Setting bearer token.");
request.setRequestHeader("Authorization", "Bearer " + $bearerToken);
});
});

Chrome和Fiddler中的控制台都确认 token 确实存在,并由JQuery发送。我使用的 token 来自HttpContext.GetOwinContext()。Authentication.User中声明主体对象上的access_token-property。

这没什么大作用。我仍然从服务器收到302响应,并且Fiddler揭示了 token 没有在随后的Ajax请求(这是GET请求)上发送到IdentityServer。

从那里,我读到这个线程:
Handling CORS Preflight requests to ASP.NET MVC actions
我试图将这段代码放入IdentityServer的startup.cs中,但是似乎没有“预检”请求进入。我在Fiddler中看到的只是(从一开始):

1-从客户端到MVC Controller 的初始Ajax请求:
POST http://localhost:12345/my/url HTTP/1.1
Host: localhost:12345
Connection: keep-alive
Content-Length: pretty long
Authorization: Bearer <insert long token here>
Origin: http://localhost:12345
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.106 Safari/537.36
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
Accept: application/json, text/javascript, */*; q=0.01
X-Requested-With: XMLHttpRequest
Referer: http://localhost:12345/my/url
Accept-Encoding: gzip, deflate
Accept-Language: nb-NO,nb;q=0.8,no;q=0.6,nn;q=0.4,en-US;q=0.2,en;q=0.2
Cookie: OpenIdConnect.nonce.<insert 30 000 lbs of hashed text here>

param=fish&morestuff=salmon&crossDomain=true

2-来自MVC Controller 的重定向响应:
HTTP/1.1 302 Found
Cache-Control: private
Location: https://identityserver.domain.com/connect/authorize?client_id=Bar&redirect_uri=http%3a%2f%2flocalhost%3a12345%2f&response_mode=form_post&response_type=id_token+token&scope=openid+profile+email [...]
Server: Microsoft-IIS/10.0
X-AspNetMvc-Version: 5.2
X-AspNet-Version: 4.0.30319
Set-Cookie: OpenIdConnect.nonce.<lots of hashed text>
X-SourceFiles: <more hashed text>
X-Powered-By: ASP.NET
Date: Fri, 15 Jan 2016 12:23:08 GMT
Content-Length: 0

3-对IdentityServer的Ajax请求:
GET https://identityserver.domain.com/connect/authorize?client_id=Bar&redirect_uri=http%3a%2f%2flocalhost%3a12345%2f&response_mode=form_post&response_type=id_token+token&scope=openid+profile+email [...]
Host: identityserver.domain.com
Connection: keep-alive
Accept: application/json, text/javascript, */*; q=0.01
Origin: http://localhost:12345
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.106 Safari/537.36
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
Referer: http://localhost:12345/my/url
Accept-Encoding: gzip, deflate, sdch
Accept-Language: nb-NO,nb;q=0.8,no;q=0.6,nn;q=0.4,en-US;q=0.2,en;q=0.2

4-IdentityServer3的响应
HTTP/1.1 302 Found
Content-Length: 0
Location: https://identityserver.domain.com/login?signin=<some hexadecimal id>
Server: Microsoft-IIS/8.5
Set-Cookie: SignInMessage.<many, many, many hashed bytes>; path=/; secure; HttpOnly
X-Powered-By: ASP.NET
Date: Fri, 15 Jan 2016 12:23:11 GMT

5- Chrome 的崩溃

XMLHttpRequest cannot load https://identityserver.domain.com/connect/authorize?client_id=Bar&blahblahblah. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost:12345' is therefore not allowed access.

最佳答案

我也遇到了这个问题,由于您在STS上失去了 token 有效性,因此UseTokenLifetime = false不能解决问题。

当我尝试使用授权的api方法时,即使我在Owin上是有效的,我仍然得到401。

我发现的解决方案是将UseTokenLifetime = true保留为默认值,但编写一个全局ajax错误处理程序(或有角度的http拦截器),如下所示:

$.ajaxSetup({
global: true,
error: function(xhr, status, err) {
if (xhr.status == -1) {
alert("You were idle too long, redirecting to STS") //or something like that
window.location.reload();
}
}});

触发身份验证工作流程。

关于ajax - Ajax中的CORS请求具有IdentityServer3授权的MVC Controller ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34768432/

26 4 0
文章推荐: jQuery : How to iterate in all links of a specific table row
文章推荐: python - Mel 到 Python 的难度
文章推荐: javascript - 替换文本中的单词
文章推荐: jquery - 将新标签附加到特定元素之后的
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com