IdentityServer4 并调用自定义函数

IdentityServer4 and calling a custom function

我想要实现的是:设置一个 IdentityServer4 实例,将 username/password 的身份验证交给位于另一个 .net 程序集中的函数。我知道 OpenID Connect 是一种选择,但提出自定义 IdP 给人的印象是小题大做。

是否有使用 Identityserver 实现此目的的任何简单方法?

是的。在 Startup 中的 ConfigureServices 方法中,您需要注册自己的 IProfileServiceIResourceOwnerPasswordValidator 实现。例如:

services.AddTransient<IProfileService, CustomProfileService>();
services.AddTransient<IResourceOwnerPasswordValidator, ResourceOwnerPasswordValidator>();

IResourceOwnerPasswordValidator 上的 ValidatedAsync 方法是您随后可以访问 username/password 并调用您自己的程序集进行验证的地方。然后,您 return 来自该方法的 GrantValidationResult 对象来指示 success/failure。 例如:

public Task ValidateAsync(ResourceOwnerPasswordValidationContext context)
    {
        logWriter.Debug("Validating resource owner password: " + context.UserName);
        if (_userRepository.ValidatePassword(context.UserName, context.Password))
        {
            context.Result = new GrantValidationResult(context.UserName, "password");
            return Task.FromResult(0);
        }

        logWriter.Debug("Unauthorised resource owner password for: " + context.UserName);
        return Task.FromResult(new GrantValidationResult(TokenRequestErrors.UnauthorizedClient));
    }

IProfileService 是您可以在上下文中设置声明的地方,例如通过检查已请求的内容(如 ApiResource 定义中所定义),然后自己调用任何一个assemblies/repo 您需要了解这些索赔的详细信息。