pit*_*dis 8 asp.net-core blazor blazor-client-side asp.net-blazor blazor-webassembly
几天来,我尝试申报 Blazor 应用程序的索赔。我终于找到了一种应该可行的方法,但由于某种原因,我无法在索赔列表中找到我的索赔。我创建了以下 AppClaimsPrincipalFactory:
public class AppClaimsPrincipalFactory : UserClaimsPrincipalFactory<ApplicationUser>
{
public AppClaimsPrincipalFactory(UserManager<ApplicationUser> userManager, IOptions<IdentityOptions> optionsAccessor) : base(userManager, optionsAccessor)
{
}
public override async Task<ClaimsPrincipal> CreateAsync(ApplicationUser user)
{
var id = await GenerateClaimsAsync(user);
if (user != null)
{
id.AddClaim(new Claim(ClaimTypes.GivenName, user.FirstName));
}
return new ClaimsPrincipal(id);
var principal = await base.CreateAsync(user);
if (!string.IsNullOrWhiteSpace(user.FirstName))
{
((ClaimsIdentity)principal.Identity).AddClaim(new Claim(ClaimTypes.GivenName, user.FirstName));
}
if (!string.IsNullOrWhiteSpace(user.LastName))
{
((ClaimsIdentity)principal.Identity).AddClaim(new Claim(ClaimTypes.Surname, user.LastName));
}
return principal;
}
}
Run Code Online (Sandbox Code Playgroud)
我在Startup.cs文件的ConfigureServices中添加了以下代码:
services.AddScoped<IUserClaimsPrincipalFactory<ApplicationUser>, AppClaimsPrincipalFactory>();
Run Code Online (Sandbox Code Playgroud)
有人可以帮我找出我的代码有什么问题吗?先感谢您。
更新
感谢布莱恩·帕克为我铺平了道路。为了使其在其他人需要时能够工作,我更改了 AppClaimsPrincipalFactory 类,如下所示:
public class AppClaimsPrincipalFactory : UserClaimsPrincipalFactory<ApplicationUser>
{
public AppClaimsPrincipalFactory(UserManager<ApplicationUser> userManager, IOptions<IdentityOptions> optionsAccessor) : base(userManager, optionsAccessor)
{
}
protected override async Task<ClaimsIdentity> GenerateClaimsAsync(ApplicationUser user)
{
ClaimsIdentity claims = await base.GenerateClaimsAsync(user);
claims.AddClaim(new Claim("name", "Aris"));
claims.AddClaim(new Claim("customClaim", "test value"));
claims.AddClaim(new Claim(ClaimTypes.GivenName, user.FirstName));
claims.AddClaim(new Claim(ClaimTypes.Surname, user.LastName));
return claims;
}
}
Run Code Online (Sandbox Code Playgroud)
我还更改了 Startup.cs 文件中的代码 services.AddDefaultIdentity:
services.AddDefaultIdentity<ApplicationUser>(options => options.SignIn.RequireConfirmedAccount = true)
.AddRoles<IdentityRole>()
.AddEntityFrameworkStores<ApplicationDbContext>()
.AddClaimsPrincipalFactory<AppClaimsPrincipalFactory>();
Run Code Online (Sandbox Code Playgroud)
因此具有以下声明值:
name: ["myemail@hotmail.com","Aris"]
customClaim: test value
http://schemas.xmlsoap.org/ws/2005/05/identity/claims/givenname: Aristotelis
http://schemas.xmlsoap.org/ws/2005/05/identity/claims/surname: Pitaridis
Run Code Online (Sandbox Code Playgroud)
谢谢布莱恩·帕克。你让我今天一整天都感觉很好。
尝试 :
services.AddScoped<AppClaimsPrincipalFactory>();
Run Code Online (Sandbox Code Playgroud)
services.AddDefaultIdentity<ApplicationUser>(options => options.SignIn.RequireConfirmedAccount = true)
.AddRoles<IdentityRole>()
.AddEntityFrameworkStores<ApplicationDbContext>()
.AddClaimsPrincipalFactory<AppClaimsPrincipalFactory>();
services.AddIdentityServer()
.AddApiAuthorization<ApplicationUser, ApplicationDbContext>(options =>
{
options.IdentityResources["openid"].UserClaims.Add(ClaimTypes.GivenName);
options.ApiResources.Single().UserClaims.Add(ClaimTypes.GivenName);
options.IdentityResources["openid"].UserClaims.Add(ClaimTypes.Surname);
options.ApiResources.Single().UserClaims.Add(ClaimTypes.Surname);
});
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
5318 次 |
最近记录: |