也可以自定義實現,不使用IdentityServer4.AspNetIdentity這個包,當然還要實現其他接口IResourceOwnerPasswordValidator、 IProfileService等
Idr4結合AspNetCore.Identity實現Claims認證需要一個問題:
額外再去去實現IUserClaimsPrincipalFactory接口,為什么要實現這個接口呢?
本生是能夠登錄的,但是過一段時間就會出現設置value值為null的錯誤如圖
其實是Claims身份認證信息過期需要重新創建,所以我們要實現IUserClaimsPrincipalFactory接口來實現里面的CreateAsync
public class UserClaimsPrincipal : IUserClaimsPrincipalFactory<IdentityUser> { private readonly IUserStoreService _storeService; public UserClaimsPrincipal(IUserStoreService storeService) { _storeService = storeService; } public async Task<ClaimsPrincipal> CreateAsync(IdentityUser user) { var claims = await _storeService.GetAllClaimsByUser(user); ClaimsIdentity claimsIdentity = new ClaimsIdentity(claims); ClaimsPrincipal claimsPrincipal = new ClaimsPrincipal(claimsIdentity); return await Task.FromResult(claimsPrincipal); } }
處理如上,處理后一旦身份信息過期就會調用本方法重新創建身份信息
同時我們需要在服務中添加相關服務
services.AddIdentity<IdentityUser, IdentityRole>(options => { options.User.RequireUniqueEmail = false; options.Password.RequiredLength = 6; options.Password.RequireLowercase = false; options.Password.RequireNonAlphanumeric = false; options.Password.RequireUppercase = false; options.Password.RequireDigit = false; }) .AddEntityFrameworkStores<ApplicationDbContext>() .AddDefaultTokenProviders() .AddClaimsPrincipalFactory<UserClaimsPrincipal>();
這里有一個很奇葩的問題 就是在用來 AspNetIdentity 這個包以后,按理說我不需要再去實現
IResourceOwnerPasswordValidator、 IUserClaimsPrincipalFactory、IProfileService 這些了, 本機調試測試登錄都沒有問題 但是發布在IIS上依然會出現 Value null的問題
查看Cookie發現 OIDC 中間件的cookies根本沒有生成,沒辦法 我又手動注入了IUserClaimsPrincipalFactory、IProfileService 這個接口及實現,發布后就OK了
但是本機調試運行發現OIDC生成的中間件Cookies 居然是這樣
很奇怪~
GitHub上有簡單的例子
https://github.com/woshilangdanger