我按照这里的文档进行操作,能够使我的控制器使用[Authorize]
标头。我使用带有ASP.NET Identity的IdentityServer作为用户存储。
在我的ConfigureServices
我有:
services.AddIdentity<KipUser, IdentityRole>()
.AddEntityFrameworkStores<KipDbContext>()
.AddDefaultTokenProviders();
在我的Configure
我有:
app.UseIdentityServer();
app.UseAuthorization();
在我的控制器中,我做了一些测试:
[Authorize]
public IEnumerable<MyDTO> GetData(int count = 3) {
var test = User; // The User.Identity.Name is empty for some reason
var id = User.FindFirst(ClaimTypes.NameIdentifier).Value; // Successfully gets the Guid
var test2 = _userManager.GetUserAsync(User); // result is null
var test3 = _userManager.GetUserId(User); //returns null
var test4 = _userManager.FindByIdAsync(id); // Successfully gets the User from the DB
似乎存在配置错误,因为UserManager无法从ClaimsPrincipal User
变量获取ASP.Net标识。我是不是假设太多了.AddEntityFrameworkStores<KipDbContext>()
会配置应用程序知道如何_userManager.GetUserAsync(User)
需要,而不是我的搜索要求自己对这个_userManager.FindByIdAsync(User.FindFirst(ClaimTypes.NameIdentifier).Value)
?
我问这个问题的主要原因是因为我看到了很多有关IdentityServer 2和3的信息,这些信息似乎相关。我无法在IdentityServer 4项目中使用这些修复程序,因此我认为这是一个不同的问题。这是同样的问题。正如@Tore指出的那样,这是索赔的问题,但我认为可以通过app.UseIdentityServer();
这清楚地描述了该问题:
UseIdentity和UserManager在存储用户ID声明的位置上存在分歧
即使我们正在调用app.UseIdentityServer();
它,似乎也需要清除Microsoft提供的一些默认映射。
对于那个问题,JwtSecurityTokenHandler.DefaultInboundClaimTypeMap.Clear();
在为我解决问题Startup.cs
Configure
之前添加功能app.UseIdentityServer();
。我现在可以看到的说法是在控制器不变,都_userManager.GetUserAsync(User);
和_userManager.GetUserId(User);
正常工作。
令人惊讶的是,此函数调用未包含在IdentityServerAspNetIdentity
示例项目中。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句