IdentityServer4结合AspNetCore.Identity实现登录认证踩坑填坑记录

龙码精神 2020/5/6 23:39:20

也可以自定义实现,不使用IdentityServer4.AspNetIdentity这个包,当然还要实现其他接口IResourceOwnerPasswordValidator、 IProfileService等 Idr4结合AspNetCore.Identity实现Claims认证需要一个问题: 额

也可以自定义实现,不使用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);
    }
}</span></pre>

处理如上,处理后一旦身份信息过期就会调用本方法重新创建身份信息

同时我们需要在服务中添加相关服务

 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</span>&lt;ApplicationDbContext&gt;<span style="color: #000000;">()
            .AddDefaultTokenProviders()
            <span style="color: #ff0000;">.AddClaimsPrincipalFactory</span></span><span style="color: #ff0000;">&lt;UserClaimsPrincipal&gt;();</span></pre>

这里有一个很奇葩的问题 就是在用来 AspNetIdentity 这个包以后,按理说我不需要再去实现 

IResourceOwnerPasswordValidator、 IUserClaimsPrincipalFactory、IProfileService 这些了, 本机调试测试登录都没有问题 但是发布在IIS上依然会出现 Value null的问题

查看Cookie发现 OIDC 中间件的cookies根本没有生成,没办法 我又手动注入了IUserClaimsPrincipalFactory、IProfileService 这个接口及实现,发布后就OK了

 

 但是本机调试运行发现OIDC生成的中间件Cookies 居然是这样

很奇怪~

 GitHub上有简单的例子

https://github.com/woshilangdanger

随时随地学软件编程-关注百度小程序和微信小程序
关于找一找教程网

本站文章仅代表作者观点,不代表本站立场,所有文章非营利性免费分享。
本站提供了软件编程、网站开发技术、服务器运维、人工智能等等IT技术文章,希望广大程序员努力学习,让我们用科技改变世界。
[IdentityServer4结合AspNetCore.Identity实现登录认证踩坑填坑记录]http://www.zyiz.net/tech/detail-133202.html

上一篇:.NetCore 扩展封装 Expression<Func<T, bool>> 查询条件遇到的问题

下一篇:.NetCore 使用 Linq 动态拼接Expression表达式条件来实现 对EF、EF Core 扩展查询排序操作

赞(0)
关注微信小程序
程序员编程王-随时随地学编程

扫描二维码或查找【程序员编程王】

可以随时随地学编程啦!

技术文章导航 更多>
扫一扫关注最新编程教程