WebAPI 第一次重定向为 POST 然后作为 GET 到 Angular 应用程序
WebAPI first time redirect as POST then as GET to the Angular application
我有严格的基础架构,无法更改并尝试启用 IdentityServer4 以使用 SAML2.0 断言和令牌。只有 API 可以暴露在互联网上。工作流程是这样的:
1. 用户点击 angular 个应用
2. 用户被重定向到外部 SAML2.0 IDP 提供商,并验证自己。
3. IDP 重定向到带有 SAML 断言的 WebApi,然后重定向到 IS4 以进行验证和令牌生成
4. WebAPI 将token 发送到Angular APP 获取请求(这里是问题)
第一次登录 IDP 时,WebApi 将 POST 消息发送到 angular,这显然会导致错误。当我刷新浏览器时,工作流程以相同的方式进行,但不需要提供凭据,因为我已经在 IDP 中 sing-in,WebApi 发送 GET 消息 Angular 获取令牌并保存它。
我已经尝试了多种解决方案,结合重定向操作,将 header 添加到响应中,发送带有位置和 301 状态代码的 HttpResponseMessage。对于所有这些,我第一次得到 POST 或者在发送原始 httpResponseMessage 时只是 Json。
[HttpPost]
[AllowAnonymous]
public async Task<IActionResult> PostLogin()
{
var form = Request.Form;
var samlResponse = form["SamlResponse"];
using (HttpClient client = new HttpClient())
{
var response = await client.RequestTokenAsync(new TokenRequest
{
Address = $"{_configuration["IdentityServer"]}/connect/token",
GrantType = "SamlResponse",
ClientId = "Client",
ClientSecret = "Client",
Parameters = { { "SamlResponse", samlResponse } }
});
var r = new HttpResponseMessage(HttpStatusCode.SeeOther);
r.Headers.Location = new Uri($"{_configuration["webpage"]}/login?token={response.Json["access_token"]}");
Response.Headers.Add(HeaderNames.Location, $"{_configuration["webpage"]}/login?token={response.Json["access_token"]}");
return StatusCode(301);
}
或
var r = new HttpResponseMessage(HttpStatusCode.SeeOther);
r.Headers.Location = new Uri($"{_configuration["webpage"]}/login?token={response.Json["access_token"]}");
return StatusCode(301, r);
或
[HttpPost]
[AllowAnonymous]
public async Task<IActionResult> PostLogin()
{
var form = Request.Form;
var samlResponse = form["SamlResponse"];
using (HttpClient client = new HttpClient())
{
var response = await client.RequestTokenAsync(new TokenRequest
{
Address = $"{_configuration["IdentityServer"]}/connect/token",
GrantType = "SamlResponse",
ClientId = "Client",
ClientSecret = "Client",
Parameters = { { "SamlResponse", samlResponse } }
});
if (response.IsError)
{
return StatusCode(400, response.Error);
}
return Redirect($"{_configuration["webpage"]}/login?token={response.Json["access_token"]}");
}
}
解决方案是在 chrome 启用 chrome://flags/#allow-insecure-localhost 标志。红色证书导致刷新初始 POST 请求。之后一切顺利。
我有严格的基础架构,无法更改并尝试启用 IdentityServer4 以使用 SAML2.0 断言和令牌。只有 API 可以暴露在互联网上。工作流程是这样的: 1. 用户点击 angular 个应用 2. 用户被重定向到外部 SAML2.0 IDP 提供商,并验证自己。 3. IDP 重定向到带有 SAML 断言的 WebApi,然后重定向到 IS4 以进行验证和令牌生成 4. WebAPI 将token 发送到Angular APP 获取请求(这里是问题)
第一次登录 IDP 时,WebApi 将 POST 消息发送到 angular,这显然会导致错误。当我刷新浏览器时,工作流程以相同的方式进行,但不需要提供凭据,因为我已经在 IDP 中 sing-in,WebApi 发送 GET 消息 Angular 获取令牌并保存它。
我已经尝试了多种解决方案,结合重定向操作,将 header 添加到响应中,发送带有位置和 301 状态代码的 HttpResponseMessage。对于所有这些,我第一次得到 POST 或者在发送原始 httpResponseMessage 时只是 Json。
[HttpPost]
[AllowAnonymous]
public async Task<IActionResult> PostLogin()
{
var form = Request.Form;
var samlResponse = form["SamlResponse"];
using (HttpClient client = new HttpClient())
{
var response = await client.RequestTokenAsync(new TokenRequest
{
Address = $"{_configuration["IdentityServer"]}/connect/token",
GrantType = "SamlResponse",
ClientId = "Client",
ClientSecret = "Client",
Parameters = { { "SamlResponse", samlResponse } }
});
var r = new HttpResponseMessage(HttpStatusCode.SeeOther);
r.Headers.Location = new Uri($"{_configuration["webpage"]}/login?token={response.Json["access_token"]}");
Response.Headers.Add(HeaderNames.Location, $"{_configuration["webpage"]}/login?token={response.Json["access_token"]}");
return StatusCode(301);
}
或
var r = new HttpResponseMessage(HttpStatusCode.SeeOther);
r.Headers.Location = new Uri($"{_configuration["webpage"]}/login?token={response.Json["access_token"]}");
return StatusCode(301, r);
或
[HttpPost]
[AllowAnonymous]
public async Task<IActionResult> PostLogin()
{
var form = Request.Form;
var samlResponse = form["SamlResponse"];
using (HttpClient client = new HttpClient())
{
var response = await client.RequestTokenAsync(new TokenRequest
{
Address = $"{_configuration["IdentityServer"]}/connect/token",
GrantType = "SamlResponse",
ClientId = "Client",
ClientSecret = "Client",
Parameters = { { "SamlResponse", samlResponse } }
});
if (response.IsError)
{
return StatusCode(400, response.Error);
}
return Redirect($"{_configuration["webpage"]}/login?token={response.Json["access_token"]}");
}
}
解决方案是在 chrome 启用 chrome://flags/#allow-insecure-localhost 标志。红色证书导致刷新初始 POST 请求。之后一切顺利。