C# 为标识用户自定义属性实现get/set方法

C# 为标识用户自定义属性实现get/set方法,c#,asp.net-core-identity,asp.net-core-3.1,C#,Asp.net Core Identity,Asp.net Core 3.1,我正在使用Identity,并用三个自定义属性扩展了基本IdentityUser。使用.netCore 3.1.1和identity 4 namespace FleetLogix.Intranet.Identity { // Add profile data for application users by adding properties to the ApplicationUser class public class ApplicationUser : IdentityU

我正在使用Identity,并用三个自定义属性扩展了基本IdentityUser。使用.netCore 3.1.1和identity 4

namespace FleetLogix.Intranet.Identity
{
    // Add profile data for application users by adding properties to the ApplicationUser class
    public class ApplicationUser : IdentityUser<int>
    {
        [MaxLength(50)]
        [PersonalData]
        public string FirstName { get; set; }

        [MaxLength(50)]
        [PersonalData]
        public string LastName { get; set; }

        [MaxLength(5)]
        public string OrgCode { get; set; }

        public ApplicationUser() : base()
        {

        }


    }
}

我正在设置一个新网站,希望修改
\u LoginPartial.cshtml
。我想用登录名替换登录用户名(电子邮件地址)的显示

@if (SignInManager.IsSignedIn(User))
{
    <li class="nav-item">
    <a id="manage" class="nav-link text-dark" asp-area="Identity" asp-page="/Account/Manage/Index" title="Manage">Hello @UserManager.GetUserName(User)!</a> 
    </li>
   ...
}

为什么自定义属性在此页上可见,而在上一页上不可见?

Account/Manage/Index
中还有更新方法
OnPostAsync()

公共异步任务OnPostAsync() { var user=await\u userManager.GetUserAsync(用户); if(user==null) { 返回NotFound($“无法加载ID为“{{u userManager.GetUserId(user)}”的用户”); } 如果(!ModelState.IsValid) { 等待加载异步(用户); 返回页(); } var phoneNumber=await\u userManager.GetPhoneNumberAsync(用户); if(Input.PhoneNumber!=PhoneNumber) { var setPhoneResult=wait_userManager.SetPhoneNumberAsync(用户,输入.PhoneNumber); 如果(!setPhoneResult.successed) { var userId=wait_userManager.GetUserIdAsync(用户); 抛出新的InvalidOperationException($“为ID为“{userId}”的用户设置电话号码时发生意外错误”; } } var firstName=user.firstName;//.GetPhoneNumberAsync(用户); if(Input.FirstName!=FirstName) { //var setfirstnamesult=await_userManager.setfirstnamesync(user,Input.FirstName); user.FirstName=Input.FirstName; //如果(!setFirstNameResult.successed) //{ //var userId=wait_userManager.GetUserIdAsync(用户); //抛出新的InvalidOperationException($“为ID为“{userId}”的用户设置名字时发生意外错误”; //} } var lastName=user.lastName; if(Input.LastName!=LastName) { //var setLastNameResult=await\u userManager.SetLastNameAsync(user,Input.LastName); user.LastName=Input.LastName; //如果(!setLastNameResult.successed) //{ //var userId=wait_userManager.GetUserIdAsync(用户); //抛出新的InvalidOperationException($“为ID为“{userId}”的用户设置姓氏时发生意外错误”; //} } 等待(u signInManager.RefreshSignInAsync)(用户);; StatusMessage=“您的个人资料已更新”; 返回重定向Topage(); } 没有像
setPhoneNumberSync()这样的Set方法,我尝试使用属性setter。这不管用如何更新标识用户自定义属性值?

我只想能够使用自定义用户属性。我需要FirstName&OrgCode属性在他们登录后立即可用,但目前情况并非如此。当前的扩展方法并不总是有效的


此外,我需要能够编辑这些属性,以防它们出现错误或更改了要求。

您需要创建标识范围,只需创建标识并添加范围

services.AddScoped<IUserIdentity, UserIdentity>();
实施:

    public class UserIdentityAccessor
    {
        private readonly RequestDelegate _next;

        public UserIdentityAccessor(RequestDelegate next)
        {
            _next = next;
        }

        public async Task InvokeAsync(HttpContext context, IUserIdentity userIdentity)
        {
            var user = (ClaimsIdentity) context.User.Identity;

            if (user.IsAuthenticated)
            {
                var first = user.FindFirst(ClaimsName.FirstName).Value; \\ get info from claims
                userIdentity.FirstName = first;                         \\ and add to identity
            }
            else
            {
                userIdentity.FirstName = null;
            }

            await _next(context);
        }
    }

现在,您可以在任何地方获得您想要的标识

用户标识是否应该成为ApplicationSerialIdentity,以匹配我的实现?
services.AddScoped()已添加到Startup.ConfigureServices()。IUserIdentity、UserIdentity不解析。遗漏包括<代码>app.useMidleware()添加到启动中。在FleetLogix.Intranet.Identity命名空间中创建Configure()
UserIdentityAccessor
。I严重性也不在这里解决。必须将
ClaimsName.FirstName
更改为
claimstypes.GivenName
您的回答唤起了以前做过这件事的记忆。此外,我还在一个旧项目中找到CustomClaimsPrincipalFactory.cs。将其注册为
services.AddScoped()在ConfigureServices中似乎已经解决了我的问题,但接受你的答案会让我找到正确的答案。很抱歉,我的答案不完整,用户标识不是继承的类,当我想添加一些自定义功能时,我不使用内置标识。在我的示例中,用户标识只是带有cuple属性的类。JWT,您使用什么身份验证令牌?
private async Task LoadAsync(ApplicationUser user)
{

    var userName = await _userManager.GetUserNameAsync(user);
    var phoneNumber = await _userManager.GetPhoneNumberAsync(user);
    var firstName =  user.FirstName;
    var lastName = user.LastName;
    var orgCode = user.OrgCode;


    Username = userName;

    OrgCode = orgCode;

    Input = new InputModel
    {
        PhoneNumber = phoneNumber,
        FirstName = firstName,
        LastName = lastName

    };
}
public async Task<IActionResult> OnPostAsync()
{
   var user = await _userManager.GetUserAsync(User);
   if (user == null)
   {
       return NotFound($"Unable to load user with ID '{_userManager.GetUserId(User)}'.");
   }

   if (!ModelState.IsValid)
   {
       await LoadAsync(user);
       return Page();
   }

   var phoneNumber = await _userManager.GetPhoneNumberAsync(user);
   if (Input.PhoneNumber != phoneNumber)
   {
       var setPhoneResult = await _userManager.SetPhoneNumberAsync(user, Input.PhoneNumber);
       if (!setPhoneResult.Succeeded)
       {
           var userId = await _userManager.GetUserIdAsync(user);
           throw new InvalidOperationException($"Unexpected error occurred setting phone number for user with ID '{userId}'.");
       }
   }

   var firstName = user.FirstName; //.GetPhoneNumberAsync(user);
   if (Input.FirstName != firstName)
   {
       //var setFirstNameResult = await _userManager.SetFirstNameAsync(user, Input.FirstName);
       user.FirstName = Input.FirstName;
       //if (!setFirstNameResult.Succeeded)
       //{
       //    var userId = await _userManager.GetUserIdAsync(user);
       //    throw new InvalidOperationException($"Unexpected error occurred setting First Name for user with ID '{userId}'.");
       //}
   }


   var lastName = user.LastName;
   if (Input.LastName != lastName)
   {
       //var setLastNameResult = await _userManager.SetLastNameAsync(user, Input.LastName);
       user.LastName = Input.LastName;
       //if (!setLastNameResult.Succeeded)
       //{
       //    var userId = await _userManager.GetUserIdAsync(user);
       //    throw new InvalidOperationException($"Unexpected error occurred setting Last Name for user with ID '{userId}'.");
       //}
   }

   await _signInManager.RefreshSignInAsync(user);
   StatusMessage = "Your profile has been updated";
   return RedirectToPage();
}
services.AddScoped<IUserIdentity, UserIdentity>();
app.UseMiddleware<UserIdentityAccessor>();
    public class UserIdentityAccessor
    {
        private readonly RequestDelegate _next;

        public UserIdentityAccessor(RequestDelegate next)
        {
            _next = next;
        }

        public async Task InvokeAsync(HttpContext context, IUserIdentity userIdentity)
        {
            var user = (ClaimsIdentity) context.User.Identity;

            if (user.IsAuthenticated)
            {
                var first = user.FindFirst(ClaimsName.FirstName).Value; \\ get info from claims
                userIdentity.FirstName = first;                         \\ and add to identity
            }
            else
            {
                userIdentity.FirstName = null;
            }

            await _next(context);
        }
    }