【问题标题】:Process web API callback's response after window.location.href redirect在 window.location.href 重定向后处理 Web API 回调的响应
【发布时间】: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重定向?

【问题讨论】:

    标签: javascript asp.net angular asp.net-core-webapi openid


    【解决方案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");
            }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-01-19
      • 2018-07-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多