【问题标题】:How do I access my current user using IdentityServer4?如何使用 IdentityServer4 访问我当前的用户?
【发布时间】:2016-10-19 15:04:23
【问题描述】:

我正在尝试构建一个 SPA Web 应用程序 + IdentityServer4 + ASPNET Core + ASPNET Core Identity。我已经按照 Identityserver 文档的快速入门进行了操作,它真的很棒。我对快速入门更感兴趣Identity Server Quickstart with JS Client

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

这是解决方案资源管理器

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

我如何做到这一点? (以下所有描述的点我只是在网上看到的,我不知道如何实现它)

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

请指教。

【问题讨论】:

  • 谢谢。试试这个。使用 usermgr 时,它会在每个请求中调用 db 吗?还是只有一次?
  • 是的,每个请求都会进入数据库。如果您在同一个请求中多次执行相同的查询,它会命中一次,然后从缓存中提取后续调用。 (这也取决于您在 db 上下文的依赖注入中设置的生命周期,但默认情况下它的设置为 'Scoped' 或每个请求)

标签: asp.net-web-api asp.net-core single-page-application identityserver4


【解决方案1】:

IdentityServer 的想法是分离用户身份的概念。简而言之,这意味着您的web API 不应该/不会访问存储用户的数据库。

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

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

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;
    ...
}

如果您需要用户的Points 和/或Wallets,您可以从这些声明中获取sub 声明并查询您的数据库。

这也意味着您需要按用户主题存储PointsWallets

【讨论】:

  • where users are stored,这是否意味着用户和操作应该分开存储?独立数据库?哦,我明白了。因此,如果我需要来自PointsWallets 等用户的其他数据(与用户身份无关),我只需使用sub 声明并查询相关记录。对吗?
  • @BoyPasmo 是的,绝对的。
  • 是否应该/将不重要 - 应用程序逻辑必须有权访问用户身份。这就是身份服务器存在的原因。不是相反
猜你喜欢
  • 1970-01-01
  • 2018-05-31
  • 2018-03-16
  • 1970-01-01
  • 2018-05-11
  • 2011-05-17
  • 2019-03-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多