使用客户端凭据作为Usermanager <user>的一部分

时间:2018-10-11 02:51:52

标签: openiddict

当前,我在我的SPA应用程序中使用Password Flow

现在,我必须将Client Credentials流与当前的实现集成。

var descriptor = new OpenIddictApplicationDescriptor
{
    ClientId = "console",
    ClientSecret = "388D45FA-B36B-4988-BA59-B187D329C207",
    DisplayName = "My client application",
    Permissions =
{
    OpenIddictConstants.Permissions.Endpoints.Token,
    OpenIddictConstants.Permissions.GrantTypes.ClientCredentials
}

我已经在系统上成功实现了这两种集成。当使用client_id发送请求时,该应用将获得预期的授权和认证。

但是我注意到,当使用Password flow时,我与使用ApplicationUser作为dbo.User表中Asp.net身份的一部分一样。

但是client credentials来自未与应用程序用户链接的其他名称空间。

如何将client_id设置为dbo.User的一部分。如何将Client CredetialsUsermanager<User>链接?

为什么要这种实现方式是因为在执行crud操作期间,我具有列名CreatedBy。它被引用到表dbo.User中,我想从dbo.User中填充Id。但是在客户凭证流中没有User

获取用户ID

 public interface IUserResolverService
 {
    HttpContext HttpContext { get; }
    Task<Guid> GetUserId();           
 }

  public class UserResolverService : IUserResolverService
  {
        IHostingEnvironment _hostingEnv;
        private readonly IHttpContextAccessor accessor;
        private readonly UserManager<User> _user;
        public UserResolverService(IHttpContextAccessor accessor, UserManager<User> user, IHostingEnvironment hostingEnv)
        {
            this._user = user;
            this.accessor = accessor;
            this._hostingEnv = hostingEnv;
        }
        public HttpContext HttpContext
        {
            get { return accessor.HttpContext; }
        }

        public async Task<Guid> GetUserId()
        {
            var user = await _user.GetUserAsync(accessor.HttpContext.User);
            return user?.Id ?? Guid.Empty;
        }
   }

您能建议我这种情况的解决方法吗?

1 个答案:

答案 0 :(得分:0)

  

如何将client_id设置为dbo.User的一部分。如何将客户端凭据与Usermanager链接?

这是不可能的,而且实际上没有任何意义。客户端凭据是唯一不涉及任何用户的OAuth 2.0核心流程,因为它是针对“服务到服务”方案而设计的,在该方案中,客户端应用程序不代表用户,而是直接以自己的身份进行操作。

要变通解决此问题,您可能想使CreatedBy可为空,或者使用代表您在AuthorizationController中使用的应用程序的声明之一,例如客户标识符或客户名称。