【问题标题】:.net core 3.1 identity: cookies create a "request too long" error.net core 3.1 身份:cookie 创建“请求太长”错误
【发布时间】:2020-06-23 04:23:15
【问题描述】:

我使用 IUserClaimsStore 创建了一个类来在登录后设置声明:

 public class TheUserStore : IUserStore<User>, IUserRoleStore<User>, IUserPasswordStore<User>, IUserClaimStore<User>

问题是,当我的用户具有多个角色和权限时,存储我的声明不再有效,并且存储的 cookie 会产生“请求太长”错误。它们看起来像这样:

有没有办法告诉 c# 不要将这些信息存储在 cookie 中或任何其他方式来防止这个问题?

我很久没有使用 c# 了,所以我在这里不知所措。

谢谢!

【问题讨论】:

    标签: c# .net .net-core


    【解决方案1】:

    好的,不确定这是否是正确的答案,但我找到了一种方法来阻止 .net core 将所有这些信息存储在 cookie 中。在 startup.cs 我添加以下行:

    services.AddScoped<IUserClaimsPrincipalFactory<User>, AppClaimsPrincipalFactory>();
    

    然后我创建了 AppClaimsPrinzipalFactory.cs,其中包含以下内容:

    public class AppClaimsPrincipalFactory : UserClaimsPrincipalFactory<User, Role> {
        public AppClaimsPrincipalFactory(UserManager<User> userManager, RoleManager<Role> roleManager, IOptions<IdentityOptions> optionsAccessor)
               : base(userManager, roleManager, optionsAccessor) {
        }
        public override async Task<ClaimsPrincipal> CreateAsync(User user) {
            if (user == null) {
                throw new ArgumentNullException(nameof(user));
            }
            var userId = await UserManager.GetUserIdAsync(user);
            var userName = await UserManager.GetUserNameAsync(user);
            var id = new ClaimsIdentity("Identity.Application",
                Options.ClaimsIdentity.UserNameClaimType,
                Options.ClaimsIdentity.RoleClaimType);
            id.AddClaim(new Claim(Options.ClaimsIdentity.UserIdClaimType, userId));
            id.AddClaim(new Claim(Options.ClaimsIdentity.UserNameClaimType, userName));
            if (UserManager.SupportsUserSecurityStamp) {
                id.AddClaim(new Claim(Options.ClaimsIdentity.SecurityStampClaimType,
                    await UserManager.GetSecurityStampAsync(user)));
            }
    
            // code removed that adds the role claims 
            if (UserManager.SupportsUserClaim) {
                var claims = await UserManager.GetClaimsAsync(user);
                id.AddClaims(claims);
    
            }
    
            return new ClaimsPrincipal(id);
        }
    
    }
    

    不确定这里到底发生了什么,但它确实有效。在这里找到了这个答案:Recommended best practice for role claims as permissions

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-08-09
      • 2016-08-16
      • 1970-01-01
      • 2020-09-24
      • 1970-01-01
      • 2021-06-19
      • 1970-01-01
      • 2020-03-09
      相关资源
      最近更新 更多