我在尝试自定义 IdentityServer4 QuickStart 9 的快速入门之一时遇到一些问题基本上,我需要创建一个单点登录应用程序,该应用程序将由多个服务、多个 Web 应用程序、一个 Electron 和 PhoneGap 应用程序使用。
目前,我的流程比简单地验证用户身份要复杂一些,请参见下文:
用户输入登录名和密码 -> 系统验证该数据并向用户提供一系列可能的子应用程序以供选择 -> 用户选择其中一个子应用程序 -> 系统现在请求用户为此应用程序选择可能的环境(可以定制暂存/生产)
我想在身份验证层上执行此流程,因为否则,我将不得不在所有应用程序上复制所有这些步骤,并且当然我希望身份验证具有单独的开发生命周期。
目前,我正在尝试进行 3 项修改来实现此目的:
PersistentGrantStore -> 使用以下命令将此步骤保存到自定义表中 授予 key 作为引用。 (就像是 key /应用程序/环境)
IProfileService -> 添加代表此步骤的自定义声明 (卡在这里),并且是临时的,它们仅对此 token 和后续刷新有意义。
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/