Asp.net web api 如何使用IdentityServer4访问当前用户?
我正在尝试构建SPA web app+IdentityServer 4+ASPNET Core+ASPNET Core Identity。我已经学习了Identityserver文档中的快速入门,它真的很棒。我对快速入门更感兴趣 我一直在关注它,到目前为止还不错。现在,我向我的用户添加了一些字段和相关表,如下所示: 这是解决方案资源管理器 我想创建一个显示我的用户及其相关表/字段的页面。(基本上,我的问题是,如何访问当前用户并公开API供JS客户端使用) 我如何做到这一点?(以下所有描述的要点我只是在线阅读,不知道如何实现)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客户端使用) 我如何做到这一点?(以下所有描述的要
- 我应该将我的用户存储在会话中吗?然后从那里访问它
- 我应该使用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存在的原因。而不是相反