Fork me on GitHub

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

也可以自定义实现,不使用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

posted @ 2018-08-07 11:29  龙码精神  阅读(4845)  评论(7编辑  收藏  举报