angularjs 使用Azure AD与.NET Core 6和Angular进行SAML身份验证- CORS错误

odopli94  于 2023-05-21  发布在  Angular
关注(0)|答案(1)|浏览(189)

bounty还有7天到期。回答此问题可获得+100声望奖励。Festim Cahani正在寻找典型答案

使用.NET Core 6,我成功地使用cookie saml2身份验证,使用Azure AD作为IDP,SP作为后端API。测试与Swagger和它的工作预期。
我使用下面这些方法:

[HttpGet]
[Route("Login")]
public IActionResult Login(string returnUrl = null)
{
    var binding = new Saml2RedirectBinding();
    binding.SetRelayStateQuery(new Dictionary<string, string> { { relayStateReturnUrl, returnUrl ?? Url.Content("~/") } });

    return binding.Bind(new Saml2AuthnRequest(config)
        {
            ForceAuthn = true,
            
            AssertionConsumerServiceUrl = new Uri("https://localhost:44318/Auth/AssertionConsumerService")
        }).ToActionResult();
}

[HttpPost]
[Route("AssertionConsumerService")]
public async Task<IActionResult> AssertionConsumerService()
{
    var binding = new Saml2PostBinding();
    var saml2AuthnResponse = new Saml2AuthnResponse(config);

    binding.ReadSamlResponse(Request.ToGenericHttpRequest(), saml2AuthnResponse);

    if (saml2AuthnResponse.Status != Saml2StatusCodes.Success)
    {
        throw new AuthenticationException($"SAML Response status: {saml2AuthnResponse.Status}");
    }

    binding.Unbind(Request.ToGenericHttpRequest(), saml2AuthnResponse);
    await saml2AuthnResponse.CreateSession(HttpContext, claimsTransform: (claimsPrincipal) => ClaimsTransform.Transform(claimsPrincipal));

    var relayStateQuery = binding.GetRelayStateQuery();
    var returnUrl = relayStateQuery.ContainsKey(relayStateReturnUrl) ? relayStateQuery[relayStateReturnUrl] : Url.Content("~/");
    var isAuth = User.Identity.IsAuthenticated;

    //returnUrl = "http://localhost:4200/userloggedin/";
    return Redirect(returnUrl);
}

[HttpPost("Logout")]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Logout()
{
    if (!User.Identity.IsAuthenticated)
    {
        return Redirect(Url.Content("~/"));
    }

    var binding = new Saml2PostBinding();
    var saml2LogoutRequest = await new Saml2LogoutRequest(config, User).DeleteSession(HttpContext);

    return binding.Bind(saml2LogoutRequest).ToActionResult();
}

然而,当从前端Angular.JS项目发送请求时,我收到了CORS错误。
我试过了:
1.在我的后端API中启用CORS(尽管Azure抛出的是CORS错误,而不是我的后端项目)
1.在Azure ad saml配置中正确添加返回URL
1.在Angular.JS中使用反向代理,它解决了这个问题,但我在生产时会有不同的域或子域,所以不幸的是,它只是一个本地解决方案。
localhost:4200是我的前端项目,localhost:44318是我的.NET Core后端API
截图如下:

xqkwcwgp

xqkwcwgp1#

看起来您正在执行一个XHR请求,但是您不能为SAML身份验证执行此操作。
您需要导航到您的API端点,即您的“登录”端点,无论是通过链接或整个页面重定向(例如window.location.href = 'https://localhost:44318/api/v2/some-login-endpoint';)。这将:

  • 重定向至Microsoft Azure SAML URL
  • 重定向到您的API上的AssertURL(具有任何中继状态)(目前看起来只是返回URL)
  • 重定向到相应的UI URL(例如https://localhost:4200/some-url),在执行到登录端点的初始导航时,您最初将通过returnUrl查询字符串参数发送该字符串(例如:https://localhost:44318/api/v2/some-login-endpoint?returnUrl=https://localhost:4200/some-url)。

您也可以通过弹出窗口来实现,但是代码需要有所不同。

相关问题