有几天我正在阅读Duende身份服务器(IdentityServer4),所以我了解不同的概念和它们的用法,如范围,资源,客户端…
我感到困惑的地方是客户。因此,我将AspIdentity集成为IdentityServer中的ApplicationUser(您可以在代码部分中找到下面的配置),但是当我想调用/connect/令牌时,这是Duende的预定义端点,它需要添加ClientId和Secret,但我想使用我的注册用户的用户名和密码。
所以我想到的想法是创建一个自定义端点:使用SignInManager验证用户的凭据后,我会找到用户客户端,然后登录到Duende IdentityServer,但我试图这样做,但这是一个有点不方便的方式,再次对相同的服务进行http调用,以获得用户的令牌。
builder.Services.AddDbContext<ApplicationDbContext>(options =>
options.UseSqlite(connectionString));
builder.Services.AddIdentity<ApplicationUser, IdentityRole>()
.AddEntityFrameworkStores<ApplicationDbContext>()
.AddDefaultTokenProviders();
builder.Services.AddSwaggerGen();
builder.Services
.AddIdentityServer(options =>
{
options.Events.RaiseErrorEvents = true;
options.Events.RaiseInformationEvents = true;
options.Events.RaiseFailureEvents = true;
options.Events.RaiseSuccessEvents = true;
options.EmitStaticAudienceClaim = true;
})
.AddAspNetIdentity<ApplicationUser>()
.AddConfigurationStore(options =>
{
options.ConfigureDbContext = b =>
b.UseSqlite(connectionString, dbOpts => dbOpts.MigrationsAssembly(typeof(Program).Assembly.FullName));
})
.AddOperationalStore(options =>
{
options.ConfigureDbContext = b =>
b.UseSqlite(connectionString, dbOpts => dbOpts.MigrationsAssembly(typeof(Program).Assembly.FullName));
options.EnableTokenCleanup = true;
options.RemoveConsumedTokens = true;
});
builder.Services.AddAuthentication();
如果我能以一种方便的方式解决这个问题,那么其他步骤就会非常明显和直接。
clientID和secrets用于识别想要连接到IdentityServer的应用程序,而不是用户;为什么不能使用clientID/secret来实现它的目的?
另外,OpenID connect的主要目的是不让客户端应用程序接触或看到用户的用户名/密码。这就是为什么我们将身份验证委托给IdentityServer。