在 window.location.href 重定向后处理 Web API 回调的响应
Posted
技术标签:
【中文标题】在 window.location.href 重定向后处理 Web API 回调的响应【英文标题】:Process web API callback's response after window.location.href redirect 【发布时间】:2021-12-23 02:57:31 【问题描述】:我有一个以这种方式处理 OpenId 登录的 Web Api:
[HttpGet]
[AllowAnonymous]
[Route("ExternalLogin", Name = "ExternalLogin")]
public async Task<IActionResult> ExternalLogin(string provider, string returnUrl = "")
ApplicationUser user = await GetAuthUser();
string userId = user?.Id;
var properties = _externalSignInService.ConfigureExternalAuthenticationProperties(provider, Url.Action("ExternalCallback", "Account", new returnUrl, userId ));
return Challenge(properties, provider);
这是从带有 JS 重定向功能的 Angular 应用程序调用的(它是硬编码的,因为我试图让它首先工作)。
public loginExternal()
window.location.href = `https://localhost:5001/v1/account/ExternalLogin?provider=Steam&returnUrl=$window.location.href`;
Steam登录成功后,会回调那里指定的方法 Url.Action(...)
[HttpGet]
[AllowAnonymous]
[Route("Steam", Name = "ExternalCallback")]
public async Task<ActionResult<LoginResponseDto>> ExternalCallback(string error = null, string returnUrl = "", string userId = null)
if (error != null)
return Redirect(returnUrl + "/unauthorized");
...sign in duties...
return ProduceLoginResponse(signInResult);
private ActionResult<LoginResponseDto> ProduceLoginResponse((AppSignInResult result, SignInData data) loginResults)
var (result, data) = loginResults;
return result switch
AppSignInResult.Success => Ok(new LoginResponseDto()
AccessToken = data.Token.AccessToken,
TokenType = data.Token.TokenType,
ExpiresIn = data.Token.GetRemainingLifetimeSeconds(),
Username = data.Username,
Email = data.Email,
IsExternalLogin = data.IsExternalLogin,
ExternalAuthenticationProvider = data.ExternalAuthenticationProvider
),
_ => throw new InvalidEnumArgumentException($"Unknown sign-in result 'result'.")
;
所以在我的 Angular 应用程序中,我需要处理这些数据(将 JWT 令牌保存在存储中,等等)。如何记住我使用了window.location.href
重定向?
【问题讨论】:
【参考方案1】:我已经弄清楚了,将用户登录数据保存在 HttpContext.Session
存储中并将返回方法从 return ProduceLoginResponse(signInResult);
更改为 return Redirect(returnHost + "/sign-in");
并在重定向后,在 ngOnInit
方法内的角度登录组件中我正在调用另一个端点从HttpContext.Session
存储中获取我的登录数据。
[HttpGet]
[AllowAnonymous]
[Route("sign-in")]
public ActionResult<object> ProvideSignInDataFromSession()
var sessionData = HttpContext.Session.GetString(SignInDataKey);
if (sessionData != null)
var data = JsonConvert.DeserializeObject<SignInData>(sessionData);
return Ok(new
user = data.Username,
access_token = data.Token.AccessToken,
token_type = data.Token.TokenType,
expires_in = data.Token.GetRemainingLifetimeSeconds(),
);
return Redirect(CORS.CORS.returnOrigin + "/unauthorized");
【讨论】:
以上是关于在 window.location.href 重定向后处理 Web API 回调的响应的主要内容,如果未能解决你的问题,请参考以下文章
window.location.href 和self.location的区别
window.location和window.location.href的区别
window.location.href进行页面跳转+传参数