业务场景:
IdentityServer4 默认使用TestUser
和UserStore
,需要模拟和加载所有的用户数据,正式环境肯定不能这样实现,我们想从自己的数据库中读取用户信息,另外,因为 IdentityServer4 实现了 OpenId 协议,我们想在用户登录的时候,在请求中添加用户的一些额外信息,这样就不需要再去请求用户服务了。
具体实现:
using IdentityServer4.Models;using IdentityServer4.Services;using System.Linq;using System.Threading.Tasks;public class ProfileService : IProfileService{ public async Task GetProfileDataAsync(ProfileDataRequestContext context) { if (context.IssuedClaims.Count == 0) { if (context.Subject.Claims.Count() > 0) { context.IssuedClaims = context.Subject.Claims.ToList(); } } } public async Task IsActiveAsync(IsActiveContext context) { }}
Startup
添加对应配置(注入服务接口):
public void ConfigureServices(IServiceCollection services){ var builder = services.AddIdentityServer(); builder.AddTemporarySigningCredential() .AddInMemoryIdentityResources(Config.GetIdentityResources()) .AddInMemoryApiResources(Config.GetApiResources()) .AddInMemoryClients(Config.GetClients()); builder.Services.AddTransient();}
上面代码,会在await _interaction.GrantConsentAsync(request, grantedConsent);
执行的时候执行,用户登录直接访问数据库写在Login
中,就可以了。
如果授权模式为密码模式,需要去实现IResourceOwnerPasswordValidator
接口。
参考资料: