有几天我正在阅读 Duende Identity 服务器(IdentityServer4),所以我了解了不同的概念及其用法,例如范围、资源、客户端...
我感到困惑的地方是客户。因此,我将 AspIdentity 作为 ApplicationUser 集成到 IdentityServer 中(您可以在代码部分中找到下面的配置),但是当我想从 Duende 调用预定义端点 /connect/token 时,它需要添加 ClientId 和保密,但我想使用我注册用户的用户名和密码。
所以我想到的想法是创建一个自定义端点:使用 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 和密钥用于识别想要连接到 IdentityServer 的应用程序而不是用户;为什么不能使用 clientID/secret 来实现它的目的?
此外,OpenID 连接的主要目的是不让客户端应用程序接触或查看用户的用户名/密码。这就是我们将身份验证委托给 IdentityServer 的原因。
Identity Server 中的客户端是将使用此 Identity Server 并向此 Identity Server 请求身份验证的平台或应用程序类型。您可以注册多个您想要的客户。您还可以指定您将与哪个客户共享多少信息 阅读这篇文章以获得更好的理解。 https://docs.duendesoftware.com/identityserver/v6/fundamentals/clients/
当您从任何应用程序发出身份验证请求时,您必须指定客户端,以便 Identity Server 可以检查有关指定客户端的范围、资源、重定向 url 的详细信息,然后相应地处理请求。
基本上发送客户端详细信息只是指定该应用程序已注册以从身份服务器请求令牌。
假设您有 2 个项目 - 包含 Duende IS 的“服务器”和需要通过 Duende IS 进行身份验证的“客户端”。在 Duende IdentityServer 即“服务器”项目中,必须在 Program.cs 类中添加客户端 ID。
现在,当您希望 Duende IdentityServer 正确运行以向客户端应用程序提供身份验证时,您必须从“客户端”项目提供相同的客户端 ID。请注意,您还必须将 ASP.NET Core Identity 集成到“服务器”项目中,以便用户可以执行其登录任务。请阅读这篇Duende IS 集成文章以更好地理解。