asp.net - 使用 IdentityServer4 动态添加 SSO 步骤

标签 asp.net asp.net-core single-sign-on single-page-application identityserver4

我在尝试自定义 IdentityServer4 QuickStart 9 的快速入门之一时遇到一些问题基本上,我需要创建一个单点登录应用程序,该应用程序将由多个服务、多个 Web 应用程序、一个 Electron 和 PhoneGap 应用程序使用。

目前,我的流程比简单地验证用户身份要复杂一些,请参见下文:

用户输入登录名和密码 -> 系统验证该数据并向用户提供一系列可能的子应用程序以供选择 -> 用户选择其中一个子应用程序 -> 系统现在请求用户为此应用程序选择可能的环境(可以定制暂存/生产)

我想在身份验证层上执行此流程,因为否则,我将不得不在所有应用程序上复制所有这些步骤,并且当然我希望身份验证具有单独的开发生命周期。

目前,我正在尝试进行 3 项修改来实现此目的:

  1. PersistentGrantStore -> 使用以下命令将此步骤保存到自定义表中 授予 key 作为引用。 (就像是 key /应用程序/环境)

  2. IProfileService -> 添加代表此步骤的自定义声明 (卡在这里),并且是临时的,它们仅对此 token 和后续刷新有意义。

  3. authenticationHandler -> 验证用户是否完成了所有操作 步骤

由于我的 spa 应用程序,我还需要对 token 端点进行修改,以通过自定义 header 接受这 2 个参数

我的问题归结为:有更好的方法吗?我是不是把这个问题复杂化了?

抱歉,如果这个问题太基础了,但我不习惯进行这种类型的身份验证。

最佳答案

如果我理解正确,以下方法可能会有所帮助。

创建临时 cookie 并在用户登录后显示选择页面:

[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Login(LoginInputModel model, string button)
{
    if (ModelState.IsValid)
    {
        var loginResult = .service.Check(model.Username, model.Password);
        if (loginResult.IsSucceed)
        {
            await HttpContext.SignInAsync("TempCookies", loginResult.Principal);
            var selectViewModel = new SelectViewModel();
            model.ReturnUrl = model.ReturnUrl;
            return View("SelectUserAndEnvironment", selectViewModel);
        }
        else
        {
            ModelState.AddModelError("", "****.");
            return View(model);
        }
    }
    return View(model);
}

添加您想要的声明并登录 IdentityServerConstants.DefaultCookieAuthenticationScheme

[HttpPost]
[Authorize(AuthenticationSchemes = "TempCookies")]
[ValidateAntiForgeryToken]
public async Task<IActionResult> SelectUserAndEnvironment(SelectModel model)
{
    // add claims from select input
    var claims = new List<Claim>();
    claims.Add(new Claim(<Type>, <Value>));
    var p = new ClaimsPrincipal(new ClaimsIdentity(auth.Principal?.Identity, claims));
    await HttpContext.SignOutAsync("TempCookies");
    await HttpContext.SignInAsync(IdentityServerConstants.DefaultCookieAuthenticationScheme, p);
    return Redirect(model.ReturnUrl);
}

并在ProfileService中使用声明

public async Task GetProfileDataAsync(ProfileDataRequestContext context)
{
    // you can get claims added in login action by using context.Subject.Claims
    // other stuff
    context.IssuedClaims = claims;
    await Task.CompletedTask;
}

最后在Startup.cs中添加身份验证方案

services.AddAuthentication()
            .AddCookie("TempCookies", options =>
            {
                options.ExpireTimeSpan = new TimeSpan(0, 0, 300);
            })

如果您想使用外部登录,请适当更改上面的代码。

关于asp.net - 使用 IdentityServer4 动态添加 SSO 步骤,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51372438/

相关文章:

c# - Hangfire后台作业和重复作业之间的区别?

azure - 在 Service Fabric 集群上发布应用程序后 HttpContext.Session 为空

asp.net-core - OSX 错误 dnvm : command not found

java - 如何使用 Angular 调用基于 SAML(http-post 绑定(bind))的 REST API?

java - Spring - 如何使用 SAML 2.0 实现单点登录

single-sign-on - 如何在Keycloak中初始化多个UserProvider

c# - 打破 ASP.NET 中文件背后的大型代码

asp.net - 有关于中文 '360 secure browser' 的信息吗?下载我正在流式传输的文件时遇到问题

c# - 如何使用 CSS 或 CSSClass 或 C# 更改多个不同样式的 asp.net 文本框或标签或标签?

c# - ASP.NET Core API 版本控制 - 部分取代以前的方法版本