本文介绍了ASP.NET Core 3.1:User.Identity.Name在API控制器中为空,但存在声明名称的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我正在将Identity Server添加到现有项目中。基本上我已经准备好了,但是当我向API发出请求时,User.Identity.Name
为空。但是,User.Identity.Claims
包含名称Claim:
我知道通过HttpContext.User.FindFirstValue(ClaimTypes.Name)
获取用户名的方法,但它需要大量的代码重构,所以我宁愿避免这种方式。
我在Identity服务器中配置ApiResources的方式如下:
public static IEnumerable<ApiResource> ApiResources => new[]
{
new ApiResource
{
Name = "my-api",
DisplayName = "My API",
Description = "My API",
Scopes = new List<string> { "my-api"},
UserClaims = new List<string> {
JwtClaimTypes.Email,
JwtClaimTypes.Name,
JwtClaimTypes.Subject,
JwtClaimTypes.Role,
}
}
};
和客户端:
public static IEnumerable<Client> Clients =>
new List<Client>
{
new Client
{
// ...
AllowedScopes =
{
IdentityServerConstants.StandardScopes.OpenId,
IdentityServerConstants.StandardScopes.Profile,
IdentityServerConstants.StandardScopes.Email,
"name",
"roles",
"my-api",
}
}
};
API项目中的身份验证设置:
services.AddAuthentication(options =>
{
options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
})
.AddJwtBearer(JwtBearerDefaults.AuthenticationScheme, options =>
{
options.Authority = config["IdentityServer:Domain"];
options.TokenValidationParameters = new TokenValidationParameters
{
ValidateIssuer = true,
ValidIssuer = config["IdentityServer:Domain"],
ValidateAudience = false
};
});
services.AddAuthorization(options =>
{
options.AddPolicy("ApiScope", policy =>
{
policy.RequireAuthenticatedUser();
policy.RequireClaim("scope", "my-api");
});
});
请指教我做错了什么?
推荐答案
问题是微软和OpenID Connect对声明的名称有不同的看法。因此,您需要做的是通过以下方式告诉系统名称声明的名称是什么:
.AddJwtBearer(opt =>
{
...
opt.TokenValidationParameters.RoleClaimType = "roles";
opt.TokenValidationParameters.NameClaimType = "name";
...
}
这篇关于ASP.NET Core 3.1:User.Identity.Name在API控制器中为空,但存在声明名称的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!