【问题标题】:How to add claims based on the fields from users table in ASP.NET Core MVC?如何根据 ASP.NET Core MVC 中用户表中的字段添加声明?
【发布时间】:2020-08-03 17:58:14
【问题描述】:

如何根据保存在 ASP.NET Core MVC 中用户表中的部门名称添加声明?我有多个用户属于不同的部门。

根据他们的部门,我想创建索赔。请指导我如何做到这一点。

我知道如何使用声明存储创建和编辑用户或删除用户声明,但不知道上述问题。

【问题讨论】:

  • 一般情况下,我们会在用户成功登录后添加声明。请问您现在使用的是哪种身份验证模式? Cookie、JWT 或身份。如果您使用cookie身份验证,那么您可以通过EF核心获取用户部门,然后创建声明并添加它。
  • 我正在使用身份用户类。我没有使用 cookie 身份验证。请指导使用方法
  • 如果您在我的大学项目中为我提供指导,我将非常感谢您。只需指导我如何使用保存在用户表中的用户部门来创建索赔并授权用户访问其各自的部门控制器。
  • 有什么更新吗?我的回复对你有帮助吗?
  • 是的,先生。有效。非常感谢。

标签: c# asp.net-core entity-framework-core asp.net-core-mvc


【解决方案1】:

根据您的描述,我建议您可以创建一个继承UserClaimsPrincipalFactory 的自定义声明工厂。

然后您可以在 override GenerateClaimsAsync 方法中添加额外的声明。

更多细节,您可以参考以下代码:

MyUserClaimsPrincipalFactory:

using IdentityTestDemo.Data;
using Microsoft.AspNetCore.Identity;
using Microsoft.Extensions.Options;
using System.Linq;
using System.Security.Claims;
using System.Threading.Tasks;

namespace IdentityTestDemo
{
    public class MyUserClaimsPrincipalFactory : UserClaimsPrincipalFactory<IdentityUser>
    {
        private ApplicationDbContext _appliationDbContext;
        public MyUserClaimsPrincipalFactory(
        UserManager<IdentityUser> userManager,
        IOptions<IdentityOptions> optionsAccessor,ApplicationDbContext applicationDbContext)
            : base(userManager, optionsAccessor)
        {
            _appliationDbContext = applicationDbContext;
        }

        protected override async Task<ClaimsIdentity> GenerateClaimsAsync(IdentityUser user)
        {
           //get the data from dbcontext
           var Iuser=   _appliationDbContext.Users.Where(x => x.EmailConfirmed == true).FirstOrDefault();

            var identity = await base.GenerateClaimsAsync(user);
            //Get the data from EF core

            identity.AddClaim(new Claim("EmailTest", Iuser.Email));
            return identity;
        }
    }
}

Startup.cs:

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddDbContext<ApplicationDbContext>(options =>
            options.UseSqlServer(
                Configuration.GetConnectionString("DefaultConnection")));
        services.AddDefaultIdentity<IdentityUser>(options => options.SignIn.RequireConfirmedAccount = true)
            .AddEntityFrameworkStores<ApplicationDbContext>().AddClaimsPrincipalFactory<MyUserClaimsPrincipalFactory>(); ;
        services.AddControllersWithViews();
        services.AddRazorPages();
    }

在控制器中获取声明:

        var result = User.FindFirst("EmailTest").Value;

结果:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-10
    • 1970-01-01
    相关资源
    最近更新 更多