c# - IdentityServer4 - API 的用户权限

标签 c# asp.net-mvc api permissions identityserver4

我目前正在建立一个带有 Web API 和 MVC UI 的新项目(最终也会有一个可以与相同 API 对话的移动 UI)。

所以,我有以下计划:

  1. 用户导航到 MVC UI,这会将他们带到 IdentityServer4 服务器以登录或注册
  2. 然后将 IdentityServer 用户添加到数据库中应用程序自己的用户表中
  3. 然后可以对用户设置权限以限制他们的访问

这意味着身份服务器就是身份服务器(这意味着我允许人们通过 Google 等登录,而不必担心他们的角色和权限)。

因此,为了实现上述目标,我需要检查用户对 API 的许可,而不是客户端(客户端可以是任何东西 - 网络、手机应用程序、JavaScript 客户端等,所以我们不能依赖它处理用户权限)。

在 API 上,我实现了 Permissionhandler 和 PermissionRequirement 授权策略。因此,在 API Controller 或方法上,我可以执行如下操作:[Authorize(Policy = "CreateUser")]。看来我需要为每个系统权限制定一个策略。

因此在授权处理程序中我需要:

  1. 获取当前用户的用户名
  2. 如果他们存在于应用程序数据库中,检查他们的权限并授权或拒绝
  3. 如果它们不存在于应用程序数据库中,请添加它们,然后我们稍后可以从管理面板设置它们的权限

在我尝试从身份服务器请求用户的用户名之前,一切进展顺利。我知道我需要使用 UserInfoClient 来执行此操作,但我无法弄清楚如何使用用户的 token /凭据从身份服务器获取他们的声明或至少获取他们的 User.Identity.Name。

现在我可以只使用子 ID 将用户添加到应用程序数据库,但是管理权限的人将不知道那个人是谁,所以我真的需要使用他们的电子邮件。

现在在 MVC 客户端中,我可以毫无问题地看到 User.Identity.Name,但在 API 中该值是空的!?

所以我的问题是:我究竟如何从 API 中获取当前用户的 Identity.Name、用户名或电子邮件地址?

谢谢。

最佳答案

我想我现在已经破解了它。

            var mvcContext = context.Resource as Microsoft.AspNetCore.Mvc.Filters.AuthorizationFilterContext;
        if (mvcContext != null)
        {
            // Use the UserInfo endpoint to get the user's claims
            var discoveryClient = new DiscoveryClient("http://localhost:5000");
            var doc = await discoveryClient.GetAsync();

            var accessToken = await mvcContext.HttpContext.Authentication.GetTokenAsync("access_token");

            var userInfoClient = new UserInfoClient(doc.UserInfoEndpoint);
            var response = await userInfoClient.GetAsync(accessToken);

            var claims = response.Claims;
        }

这在 https://learn.microsoft.com/en-us/aspnet/core/security/authorization/policies 的底部有详细说明所以根据微软的说法,这是正确的方法。

但是你确实激发了这个想法,谢谢 Win。我盯着这该死的东西看了好几个小时。有时你只需要别人说点什么,任何话,诅咒就被打破了! :)

如果有人有更好的方法,我仍然愿意接受。

干杯

关于c# - IdentityServer4 - API 的用户权限,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43371514/

相关文章:

c# - 与 "always on top"相反

c# - 为什么 HttpClient.PostAsync 不会抛出失败?

c# - 将 LineGeometry 与 EllipseGeometry 组合(在代码中,而不是 XAML)

c# - 我如何按创建日期列出文件

c# - 将 EditorFor entry 的首字母大写

php - 导入时,二进制 IP 地址上的 API 调用显示奇怪的格式

c# - 将 Json 转换为字符串数组

c# - 显示 View 时出错

asp.net-mvc - ASP.NET MVC : Controller. HandleUnknownAction 404 或 405?

javascript - 如何在从 API 获取数据时添加加载动画? Vanilla js