从身份服务器 4 中的外部(但受信任)客户端登录



我要求用户可以直接在客户端上输入他的密码和用户名进行登录。

没有太多麻烦,我只是在与身份服务器相同的应用程序中创建了一个非常简单的额外身份验证操作,如下所示。

public async Task<IActionResult> AuthenticateUser(
[FromBody] LoginInputModel model,
[FromServices] AzureB2CUserService userService
)
{
var context = new ResourceOwnerPasswordValidationContext { Password = model.Password, UserName = model.Username };
await userService.ValidateAsync(context);
if (context.Result.Subject != null)  
{
AuthenticationProperties props = null;
// only set explicit expiration here if persistent. 
// otherwise we reply upon expiration configured in cookie middleware.
if (AccountOptions.AllowRememberLogin && model.RememberLogin)
{
props = new AuthenticationProperties
{
IsPersistent = true,
ExpiresUtc = DateTimeOffset.UtcNow.Add(AccountOptions.RememberMeLoginDuration)
};
};
// issue authentication cookie with subject ID and username
//   var user = _users.FindByUsername(model.Username);
await HttpContext.SignInAsync(context.Result.Subject.GetSubjectId(), model.Username, props, context.Result.Subject.Claims.ToArray());
return Ok(context.Result);
}
ModelState.AddModelError("", AccountOptions.InvalidCredentialsErrorMessage);
return BadRequest(ModelState);
}

然后,我从单页应用程序中调用此操作,如果成功,我知道本地身份验证 cookie 已用于身份服务器。

然后我从 oidc 客户端执行.userManager.signinSilent(),由于 cookie 在那里,如果我对userManager.signInRedirect使用了隐式授权,它将以完全相同的方式获得令牌,但没有用户被重定向。

  1. 这里的安全角度来看,我应该注意什么吗?(您可以假设已处理跨站点攻击和防伪令牌(。
  2. 我是否可以重定向到自定义身份验证方法中的隐式流并使其再次与客户端应用程序一起结束,而不是在之后调用静默登录?

从这里的安全角度来看,我应该注意一些事情吗? (您可以假设跨站点攻击和防伪令牌具有 已处理(。

我的理解是,您 (1( 丧失参与单点登录的能力,因为您的浏览器不会重定向到 SSO 颁发机构,并且 (2( 在密码处理中引入了一个弱点,因为您的客户端应用程序(在本例中为 JS/C#(以纯文本形式看到密码。

而不是在之后调用静默登录,我可以做一个重定向吗 到自定义身份验证方法中的隐式流并使其结束 再次使用客户端应用程序?

如果这样做,则基本上将拥有没有授权代码的authorization_code流。不妨升级到该流的更高安全性。

假设您在 ASP.NET MVC 应用程序之上有一个 SPA,您可以使用传统的 MVC 表单帖子重定向到 SSO,然后在返回时启动 SPA。

相关内容