基于ASP.NET Core Visual Studio使用单个用户帐户进行扩展,并按照IdentityServer4: Using ASP.NET Core Identity中的描述将IdentityServer4添加到项目中,帐户控制器中登录的相关部分如下所示:

ApplicationUser user = null;

    // login with username and password
    if (!string.IsNullOrEmpty(model.Username) && !string.IsNullOrEmpty(model.Password))
    {
      var result = await _signInManager.PasswordSignInAsync(model.Username, model.Password, model.RememberLogin, lockoutOnFailure: true);
      if (result.Succeeded)
      {
        user = await _userManager.FindByNameAsync(model.Username);
      }
    }
    if (user != null)
    {
      await _events.RaiseAsync(new UserLoginSuccessEvent(user.UserName, user.Id, user.UserName));
      // redirect
    }

通过此登录,identityserver4正确发出身份验证方案“Cookies”并创建所需的令牌(access_token,id_token或其他任何配置) .

现在我遇到的问题是:我想用一个额外的选项扩展用户名/密码登录,即访问密钥登录 . 这意味着,用户只提供他拥有的密钥(类似于密码) . 请放下您现在可能遇到的所有安全和用例问题 .

我的代码看起来像这样:

// login with access key
    if (!string.IsNullOrEmpty(model.AccessKey))
    {
      var result = await _signInManager.AccessKeySignInAsync(model.AccessKey);
      if (result.SignInResult.Succeeded)
      {
        user = result.User;
      }
    }
    if (user != null)
    {
      await _events.RaiseAsync(new UserLoginSuccessEvent(user.UserName, user.Id, user.UserName));
      // redirect
    }

简而言之,我已经使用我需要的功能扩展了SignInManager和UserManager . 登录"logic"正常工作(UserLoginSuccessEvent与预期用户正确激活) . 但是,IdentityServer4似乎没有注意到这一点 . 日志几乎保持为空(除了提到的事件) . 我现在的问题是:如何通知IdentityServer4这是一个成功的用户登录并且可以发出令牌?

如果您需要实现SignInManager.AccessKeySignInAsync方法:

public async Task<(SignInResult SignInResult, ApplicationUser User)> AccessKeySignInAsync(string accessKey)
{
  if (accessKey == null)
  {
    throw new ArgumentNullException(nameof(accessKey));
  }

  var user = await _userManager.FindByAccessKeyAsync(accessKey);
  return (user != null ? SignInResult.Success : SignInResult.Failed, user);
}