Asp.net web api 如何使用IdentityServer4访问当前用户?

Asp.net web api 如何使用IdentityServer4访问当前用户?,asp.net-web-api,asp.net-core,single-page-application,identityserver4,Asp.net Web Api,Asp.net Core,Single Page Application,Identityserver4,我正在尝试构建SPA web app+IdentityServer 4+ASPNET Core+ASPNET Core Identity。我已经学习了Identityserver文档中的快速入门,它真的很棒。我对快速入门更感兴趣 我一直在关注它,到目前为止还不错。现在,我向我的用户添加了一些字段和相关表,如下所示: 这是解决方案资源管理器 我想创建一个显示我的用户及其相关表/字段的页面。(基本上,我的问题是,如何访问当前用户并公开API供JS客户端使用) 我如何做到这一点?(以下所有描述的要

我正在尝试构建SPA web app+IdentityServer 4+ASPNET Core+ASPNET Core Identity。我已经学习了Identityserver文档中的快速入门,它真的很棒。我对快速入门更感兴趣

我一直在关注它,到目前为止还不错。现在,我向我的用户添加了一些字段和相关表,如下所示:

这是解决方案资源管理器

我想创建一个显示我的用户及其相关表/字段的页面。(基本上,我的问题是,如何访问当前用户并公开API供JS客户端使用)

我如何做到这一点?(以下所有描述的要点我只是在线阅读,不知道如何实现)

  • 我应该将我的用户存储在会话中吗?然后从那里访问它
  • 我应该使用connect/userinfo端点吗

请告知。

标识服务器的概念是将用户标识的概念分开。简单地说,这意味着您的
webapi
不应该/不会访问存储用户的数据库

web API
中必须包含的与用户身份相关的所有内容都应包含在由
IdentityServer
授予的
access token
中。(例如在索赔中)

在您的示例中,您可以从
applicationuser
中删除
钱包
字段,并创建用于存储它们的添加表,如下所示:

public class UserInfo
{
    public string UserSubject { get; set; }
    public int Points { get; set; }
    public ICollection<Wallet> Wallets { get; set; }
}
[Authorize]
public ActionResult SomeAction()
{
    var identity = (ClaimsIdentity)User.Identity;
    IEnumerable<Claim> claims = identity.Claims;
    ...
}
公共类用户信息
{
公共字符串UserSubject{get;set;}
公共整数点{get;set;}
公共ICollection钱包{get;set;}
}
如果您需要与用户身份相关的信息,可以从以下声明中获得:

public class UserInfo
{
    public string UserSubject { get; set; }
    public int Points { get; set; }
    public ICollection<Wallet> Wallets { get; set; }
}
[Authorize]
public ActionResult SomeAction()
{
    var identity = (ClaimsIdentity)User.Identity;
    IEnumerable<Claim> claims = identity.Claims;
    ...
}
[授权]
公共行动结果某些行动()
{
var identity=(ClaimsIdentity)User.identity;
IEnumerable claims=identity.claims;
...
}
如果您需要用户的
积分
和/或
钱包
,您可以从这些索赔中获得
sub
索赔,并查询您的数据库


这还意味着您需要按用户主题存储
积分
钱包

这有帮助吗?谢谢我想试试这个。当使用usermgr时,它是否会在每个请求中调用db?或者仅仅一次?是的,每次请求都会发送到数据库。如果您在同一请求中多次执行同一查询,它将命中该查询一次,然后从缓存中提取后续调用。(这也取决于您在db上下文的依赖项注入中为其设置的生存期,但默认情况下,其设置为“作用域”或每个请求)通过
存储用户,这是否意味着用户和操作应分开存储?独立数据库?哦,我明白了。因此,如果我需要用户提供的附加数据,如
积分
钱包
(这与用户身份无关),我只需使用
子项
声明并查询相关记录。是吗?@BoyPasmo是的,绝对是。不管它是否应该a/woulda-应用程序逻辑必须能够访问用户身份。这就是identity server存在的原因。而不是相反