我要求用户可以直接在客户端输入密码和用户名进行登录。
没有太多麻烦我只是在与身份服务器相同的应用程序中创建了一个非常简单的额外身份验证操作,如下所示。
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-client那里做了.userManager.signinSilent()
,因为cookie就在那里,如果我使用userManager.signInRedirect
的隐式授权而没有用户,它将获得完全相同的令牌被重定向。
答案 0 :(得分:0)
从安全角度来看,我是否应该注意一些问题。 (您可以假设跨站点攻击和防伪令牌具有 已被处理。)
我的理解是,您(1)放弃了参与单点登录的能力,因为您的浏览器没有重定向到SSO权限,以及(2)引入了自您的客户端应用程序(两个JS /)以来密码处理的弱点在这种情况下为C#)以明文形式查看密码。
而不是在之后调用静音登录,我可以只进行重定向 到自定义身份验证方法中的隐式流程并使其结束 再次使用客户端应用程序?
如果你这样做了,那么你基本上就拥有不带授权代码的authorization_code流程。也可以升级到该流程的更高安全性。
假设您在ASP.NET MVC应用程序之上有一个SPA,您可以使用传统的MVC表单帖子重定向到SSO,然后在返回时启动SPA。