gpt4 book ai didi

docker - 适用于无身份的 ASP.NET Core WebAPI 的 Sustainsys SAML2 示例

转载 作者:行者123 更新时间:2023-12-02 06:38:56 27 4
gpt4 key购买 nike

是否有人有适用于 ASP.NET Core WebAPI 项目(无 Mvc)的 Sustainsys Saml2 库的工作示例,没有 ASP Identity 更重要的是什么呢? github 上提供的示例强烈依赖于 MVC 和 SignInManager,我不需要也不想使用它们。

我添加了 Saml2 身份验证,最初它与我的 IdP 配合良好(我还检查了 Sustainsys 提供的 StubIdP),因此前几个步骤如下:

  • IdP 元数据已正确加载
  • 我的 API 正确重定向到登录页面
  • 登录页面重定向到/Saml2/Acs 页面,我在日志中看到它成功解析了结果

但是我不知道如何从那里继续前进并提取用户登录和其他声明(我的 IdP 还提供了一封电子邮件,并且它包含在我在日志中确认的 SAML 响应中)。

根据在网上找到的一些示例并修改了 GitHub 上的 MVC 示例,我执行了以下操作:

在 Startup.cs 中:

...
.AddSaml2(Saml2Defaults.Scheme,
options =>
{
options.SPOptions.EntityId = new EntityId("...");
options.SPOptions.ServiceCertificates.Add(...));
options.SPOptions.Logger = new SerilogSaml2Adapter();
options.SPOptions.ReturnUrl = new Uri(Culture.Invariant($"https://localhost:44364/Account/Callback?returnUrl=%2F"));

var idp =
new IdentityProvider(new EntityId("..."), options.SPOptions)
{
LoadMetadata = true,
AllowUnsolicitedAuthnResponse = true, // At first /Saml2/Acs page throwed an exception that response was unsolicited so I set it to true
MetadataLocation = "...",
SingleSignOnServiceUrl = new Uri("...") // I need to set it explicitly because my IdP returns different url in the metadata
};
options.IdentityProviders.Add(idp);
});

在 AccountContoller.cs 中(我尝试遵循 how to implement google login in .net core without an entityframework provider 中描述的有点类似的情况):

[Route("[controller]")]
[ApiController]
public class AccountController : ControllerBase
{
private readonly ILog _log;

public AccountController(ILog log)
{
_log = log;
}

[HttpGet("Login")]
[AllowAnonymous]
public IActionResult Login(string returnUrl)
{
return new ChallengeResult(
Saml2Defaults.Scheme,
new AuthenticationProperties
{
// It looks like this parameter is ignored, so I set ReturnUrl in Startup.cs
RedirectUri = Url.Action(nameof(LoginCallback), new { returnUrl })
});
}

[HttpGet("Callback")]
[AllowAnonymous]
public async Task<IActionResult> LoginCallback(string returnUrl)
{

var authenticateResult = await HttpContext.AuthenticateAsync(Constants.Auth.Schema.External);

_log.Information("Authenticate result: {@authenticateResult}", authenticateResult);

// I get false here and no information on claims etc.
if (!authenticateResult.Succeeded)
{
return Unauthorized();
}

// HttpContext.User does not contain any data either


// code below is not executed
var claimsIdentity = new ClaimsIdentity(Constants.Auth.Schema.Application);
claimsIdentity.AddClaim(authenticateResult.Principal.FindFirst(ClaimTypes.NameIdentifier));

_log.Information("Logged in user with following claims: {@Claims}", authenticateResult.Principal.Claims);

await HttpContext.SignInAsync(Constants.Auth.Schema.Application, new ClaimsPrincipal(claimsIdentity));

return LocalRedirect(returnUrl);
}

TLDR:我的 ASP.NET Core WebApi 项目中的 SAML 配置看起来不错,并且我收到了成功响应,并在日志中检查了正确的声明。我不知道如何提取这些数据(返回网址错误或者我的回调方法应该以不同的方式工作)。另外,令人费解的是为什么从 SSO 登录页面成功重定向被视为“未经请求”,也许这就是问题所在?

感谢您的帮助

最佳答案

对于在这个问题上仍然需要帮助的人,我将一个完整的工作示例推送到了 github,该示例使用 .Net Core WebAPI 作为后端,并使用 WebAPI 的 Angular 客户端。您可以从这里找到示例:

https://github.com/hmacat/Saml2WebAPIAndAngularSpaExample

关于docker - 适用于无身份的 ASP.NET Core WebAPI 的 Sustainsys SAML2 示例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55025336/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com