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# - 我需要从页面上生成的动态控件中获取按钮点击的值(value)

javascript - 如何在客户端填充下拉框数据的情况下获取下拉框选定的值

Asp.net按钮触发其他按钮的事件

.net - 在.NET Core RC2中构建.exe文件

Asp.Net-5类库(包)测试注入(inject)IOptions

tomcat - 在两个网络应用程序之间共享 session ID/登录信息

android - 从 GSResponse 获取 regToken

single-sign-on - WIF 使用 SAML 2 协议(protocol)/Federate AD FS 2.0 with CAS

c# - 从 REST Web API 应用程序创建 nuget 包

azure - ASP.NET Core 3 和 500.30 进程内启动失败