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
截图如下:
1条答案
按热度按时间xqkwcwgp1#
看起来您正在执行一个XHR请求,但是您不能为SAML身份验证执行此操作。
您需要导航到您的API端点,即您的“登录”端点,无论是通过链接或整个页面重定向(例如
window.location.href = 'https://localhost:44318/api/v2/some-login-endpoint';
)。这将:https://localhost:4200/some-url
),在执行到登录端点的初始导航时,您最初将通过returnUrl
查询字符串参数发送该字符串(例如:https://localhost:44318/api/v2/some-login-endpoint?returnUrl=https://localhost:4200/some-url
)。您也可以通过弹出窗口来实现,但是代码需要有所不同。