C# 修改身份或添加声明

Posted

技术标签:

【中文标题】C# 修改身份或添加声明【英文标题】:C# Modifying Identity or Add a Claim 【发布时间】:2021-06-30 06:34:21 【问题描述】:

应用程序是 Blazor Server .NET Core 5.0

我正在使用 .NET Core 的身份系统,但遇到了问题。我想将该人的名字与身份一起存储,以便我可以轻松调用它。

目前我有一个覆盖基本标识的类:

public class ApplicationUser : IdentityUser

    public ApplicationUser() : base()  

    [StringLength(100)]
    public string FirstName  get; set; 
    [StringLength(100)]
    public string LastName  get; set; 

我的 startup.cs 有:

        services.AddDefaultIdentity<ApplicationUser>(options => 
            options.SignIn.RequireConfirmedAccount = true;
            
        )

在我看来,这应该迫使程序的智能感知理解 ApplicationUser 是寻找身份时的默认类。

但是,当我尝试调用时:

    var authState = await AuthenticationStateProvider.GetAuthenticationStateAsync();
    var user = authState.User;

它只返回“IdentityUser”数据,而不是我的自定义 ApplicationUser 类。

我缺少 AuthenticationStateProvider 返回的内容或缺少类型转换吗?

另外,如果这完全不正确,我应该对声明执行此操作吗?如果是这样,我找不到有效使用 Blazor Server 声明的具体方法。

【问题讨论】:

WebAssembly 还是服务器端 blazor? @Brian,它是服务器端的 【参考方案1】:
public class ApplicationUser : IdentityUser

    public string FirstName  get; set; 
    public string LastName  get; set; 

在包管理器控制台中执行:

    添加迁移 CreateAppUser 更新数据库

将值插入在用户表中创建的 FirstName 和 LastName

创建一个名为:ApplicationUserClaimsTransformation 的类

ApplicationUserClaimsTransformation.cs

 using Microsoft.AspNetCore.Authentication;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using WebApplication3.Data;
using WebApplication3.Models;
using System.Security.Claims;
using Microsoft.AspNetCore.Identity;
using Microsoft.AspNetCore.Components.Authorization;

 public class ApplicationUserClaimsTransformation : IClaimsTransformation
    
        private readonly UserManager<ApplicationUser> _userManager;
        public ApplicationUserClaimsTransformation(UserManager<ApplicationUser> userManager)
        
            _userManager = userManager;
        

        
        public async Task<ClaimsPrincipal> TransformAsync(ClaimsPrincipal principal)
        
            var identity = principal.Identities.FirstOrDefault(c => c.IsAuthenticated);
            if (identity == null) return principal;

            var user = await _userManager.GetUserAsync(principal);
            if (user == null) return principal;

            // Add or replace identity.Claims.

          
             if (!principal.HasClaim(c => c.Type == ClaimTypes.GivenName))
        
            identity.AddClaim(new Claim(ClaimTypes.GivenName, user.FirstName));
       
        
        if (!principal.HasClaim(c => c.Type == ClaimTypes.Surname))
        
          identity.AddClaim(new Claim(ClaimTypes.Surname, user.LastName));
        

            return new ClaimsPrincipal(identity);
        
    

Startup.ConfigureServices

 services.AddScoped<IClaimsTransformation, 
           ApplicationUserClaimsTransformation>();

Index.razor

@page "/"

@inject AuthenticationStateProvider AuthState
@using System.Security
@using System.Security.Claims

@foreach(var c in user.Claims)

    <div>@c.Type:  @c.Value</div>

@code
    

    private ClaimsPrincipal user;

 protected override async Task OnInitializedAsync()
    
        var x = await AuthState.GetAuthenticationStateAsync();
        user =  x.User;
        await base.OnInitializedAsync();
    
    

注意:您应该将 IdentityUser 名称更改为 ApplicationUser 在 Startup 类、LogOut.cshtml 文件、_LoginPartial.cshtml 文件和 在ApplicationDbContext类的定义中:

public class ApplicationDbContext : IdentityDbContext<ApplicationUser>

【讨论】:

非常感谢!您有什么可以帮助阅读有关此主题的内容吗? Microsoft 文档对实现声明下的授权非常有用,但对声明及其相关类和接口如何工作的解释并不多。 不,抱歉,我没有搜索任何来源来解决您的问题。但我刚刚做了......我搜索了“IClaimsTransformation blazor”并得到了一个不相关的结果。当然,如果您只搜索“IClaimsTransformation”一词,您会从博客中获得一些结果,这些结果告诉您有关此接口以及如何在 Asp.Net Core 中使用它。我可以回答你的问题,因为我学到了很多关于身份验证和授权、身份提供者等方面的知识。我建议你去 chris sainty 的网站,从他的文章中学习这个领域。 您也可以阅读文档,尝试实施他们的工作(通常提供部分解决方案),然后来这里发布您的问题。我首先从 Chris Sainty 的网站了解到 Blazor 的存在。然后我来到这里并开始每天回答问题,这被证明是学习 Blazor 的最佳方式。 感谢您为我打破了这一点!我对堆栈溢出相当陌生,当有人帮助解决网站的行为时,我真的很感激。我已经标记了。我会检查那个人的。我保证我在文档中呆了大约 3 个小时。我喜欢微软的文档,他们有很好的例子,但对 imo 没有任何帮助。但我会补充你说要调查的那个人。再次感谢您的帮助! @cobb208,我已经对我的代码进行了一些更改...确保您复制了最新版本。

以上是关于C# 修改身份或添加声明的主要内容,如果未能解决你的问题,请参考以下文章

向 Windows 身份添加声明

添加新声明时更新记录的身份声明

第19章 定义资源

C#面向对象基本概念总结

澄清身份授权:将声明用作角色、角色和声明或角色声明

c# - 在注册时向身份用户添加角色失败,外键约束