使用IdentityServer的Ajax对netcore mvc app的请求重定向到授权端点

时间:2018-01-05 09:21:56

标签: ajax http asp.net-core identityserver4

我正在开发一个netcore MVC应用程序,该应用程序使用Ajax请求将数据POST到服务器。我使用IdentityServer4作为我的auth中间件。该流程是在启动应用程序时使用http://localhost:6002的URL重定向到IdentityServer(localhost:6000)。用户登录并重定向到主应用程序,然后工作正常。

Ajax GET请求也可以正常工作。我可以在控制器(User.Identity.Claims)中观察Get操作的声明列表。但是,当我从服务器尝试POST数据时,请求返回200但是从Identity Server返回Redirect = true

我来自Javascript的电话



applyUpdate(modelData) {
		let that = this;
		fetch("http://localhost:6002/Client/Update/", {
			method: 'post',
			headers: {
				'Accept': 'application/json',
				'Content-Type': 'application/json'
				},
			body: JSON.stringify(modelData)
			}
		).then(function (response) {
			return response;
		}).then(function (outData) {
			alert("saved");
		});
	}




我收到的回复是

{type: "cors", 
 url: "http://localhost:6000/account/login?returnUrl=%2Fc…%26x-client.., 
 redirected: true,
 status: 200, 
 ok: true}

我已经在应用程序上启用了CORS,因为之前我遇到了405个问题。似乎正在发生的事情是,当我从Javascript调用我的控制器操作时,正在对IdentityServer执行重定向,然后IdentityServer返回到客户端而不实际执行我的操作。

我的控制器操作类似于

    [Authorize]
    [HttpPost]      
    public async Task<JsonResult> Update([FromBody] MyVM myVM)
    {

    }

如果我删除[Authorize]属性,则会达到该方法,但User.Identity.Claims的值始终为空,在HTTP中,它包含所有声明的列表。

以下是从Startup.cs文件配置IdentityServer的相关部分

        JwtSecurityTokenHandler.DefaultInboundClaimTypeMap.Clear();         

        services.AddAuthentication(options =>
        {
            options.DefaultScheme = "Cookies";
            options.DefaultChallengeScheme = "oidc";                
        })
            .AddCookie("Cookies")
            .AddOpenIdConnect("oidc", options =>
            {
                options.SignInScheme = "Cookies";

                options.Authority = identityUrl;
                options.RequireHttpsMetadata = false;

                options.TokenValidationParameters = new TokenValidationParameters
                {
                    NameClaimType = "name",
                    RoleClaimType = "role",
                };

                options.ClientId = "my client";
                options.ClientSecret = "secret";
                options.ResponseType = "code id_token";

                options.SaveTokens = true;                  
                options.GetClaimsFromUserInfoEndpoint = true;

                options.UseTokenLifetime = false;
            });

我对这种行为感到非常难过,任何帮助都会非常感激

更新

奇怪的是,我正在使用Javascript Fetch API来执行POST,当我将其交换使用Jquery Ajax时,它完美地工作了很多,它是不管理重定向的Fetch API。此调用正常

          $.ajax({
            type: "POST",
            contentType: "application/json",
            dataType: "json",
            url: 'http://localhost:6002/Client/Update/',
            data: JSON.stringify(modelData),
            success: function success(msg) {
                alert("saved");
            },
            error: function error(xhr, data, err) {
                console.log(xhr);
            }
        });

我不想要包含依赖项Jquery

0 个答案:

没有答案