IdentityServer4 并调用自定义函数
IdentityServer4 and calling a custom function
我想要实现的是:设置一个 IdentityServer4 实例,将 username/password 的身份验证交给位于另一个 .net 程序集中的函数。我知道 OpenID Connect 是一种选择,但提出自定义 IdP 给人的印象是小题大做。
是否有使用 Identityserver 实现此目的的任何简单方法?
是的。在 Startup
中的 ConfigureServices
方法中,您需要注册自己的 IProfileService
和 IResourceOwnerPasswordValidator
实现。例如:
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 您需要了解这些索赔的详细信息。
我想要实现的是:设置一个 IdentityServer4 实例,将 username/password 的身份验证交给位于另一个 .net 程序集中的函数。我知道 OpenID Connect 是一种选择,但提出自定义 IdP 给人的印象是小题大做。
是否有使用 Identityserver 实现此目的的任何简单方法?
是的。在 Startup
中的 ConfigureServices
方法中,您需要注册自己的 IProfileService
和 IResourceOwnerPasswordValidator
实现。例如:
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 您需要了解这些索赔的详细信息。