Identity Server 4 - 资源所有者密码授予和 Google 身份验证

2023-12-23

我有一个应用程序,当前使用资源所有者密码授予类型来允许用户通过单页应用程序登录。目前,身份服务器与 Web API 托管在同一项目中。但是,我们希望添加用户使用其 Google 帐户注册/登录的功能。目前,用户数据存储在表中并由 ASP.NET Core Identity 管理。

有没有办法让“本地”用户在应用程序中既可以使用资源所有者密码授予类型,又可以通过 Google 启用第三方身份验证?目前,我们使用用户名和密码访问 Identity Server 令牌端点,并将令牌存储在浏览器中。然后它被传递到任何需要授权的端点。在集成 Google 身份验证和检索 Google 令牌时,相同的流程是否仍然有效?


所有的功劳都归于贝赫鲁兹·达尔万迪 for this https://www.linkedin.com/pulse/securing-net-core-web-api-identityserver4-using-owner-dalvandi-1/?trk=mp-author-card很棒的帖子。

此问题的解决方案是创建自定义授权并实现 IExtensionGrantValidator。

public class GoogleGrant : IExtensionGrantValidator
{
    private readonly IGoogleService _googleService;
    private readonly IAccountService _accountService;

    public GoogleGrant(IGoogleService googleService, IAccountService accountService)
    {
        _googleService = googleService;
        _accountService = accountService;
    }
    public string GrantType
    {
        get
        {
            return "google_auth";
        }
    }

    public async Task ValidateAsync(ExtensionGrantValidationContext context)
    {
        var userToken = context.Request.Raw.Get("id_token");

        if (string.IsNullOrEmpty(userToken))
        {
            //You may want to add some claims here.
            context.Result = new GrantValidationResult(TokenErrors.InvalidGrant, null);
            return;
        }
        //Validate ID token
        GoogleJsonWebSignature.Payload idTokenData = await _googleService.ParseGoogleIdToken(userToken);

        if (idTokenData != null)
        {
            //Get user from the database.
            ApplicationUser user = await _accountService.FindByEmail(idTokenData.Email);

            if(user != null)
            {
                context.Result = new GrantValidationResult(user.Id, "google");
                return;
            }
            else
            {
                return;
            }

        }
        else
        {
            return;
        }
    }
}

在启动中配置此验证器

            var builder = services.AddIdentityServer()
            .AddInMemoryIdentityResources(Config.Ids)
            .AddInMemoryApiResources(Config.Apis)
            .AddInMemoryClients(Config.Clients)
            .AddResourceOwnerValidator<CustomResourceOwnerPasswordValidator>()
            .AddExtensionGrantValidator<GoogleGrant>();//Custom validator.

最后但并非最不重要的一点。 在配置文件中添加以下代码。请注意“google_auth”授权类型。

new Client
            {
                ClientId = "resourceownerclient",

                AllowedGrantTypes = GrantTypes.ResourceOwnerPasswordAndClientCredentials.Append("google_auth").ToList(),
                AccessTokenType = AccessTokenType.Jwt,
                AccessTokenLifetime = 3600,
                IdentityTokenLifetime = 3600,
                UpdateAccessTokenClaimsOnRefresh = true,
                SlidingRefreshTokenLifetime = 30,
                AllowOfflineAccess = true,
                RefreshTokenExpiration = TokenExpiration.Absolute,
                RefreshTokenUsage = TokenUsage.OneTimeOnly,
                AlwaysSendClientClaims = true,
                Enabled = true,
                ClientSecrets=  new List<Secret> { new Secret("dataEventRecordsSecret".Sha256()) },
                AllowedScopes = {
                    IdentityServerConstants.StandardScopes.OpenId,
                    IdentityServerConstants.StandardScopes.Profile,
                    IdentityServerConstants.StandardScopes.Email,
                    IdentityServerConstants.StandardScopes.OfflineAccess,
                    "api1"
                }
            }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Identity Server 4 - 资源所有者密码授予和 Google 身份验证 的相关文章

随机推荐

  • Russell Libby 的 Pipes 组件

    有谁知道哪里可以下载 Russell Libby 的命名管道 成分 我能找到的所有链接都指向 http home roadrunner com rllibby source html http home roadrunner com rll
  • 在 htaccess 重写规则中附加秘密令牌作为查询字符串有多安全?

    我在尝试提供答案时做了一些测试mod rewrite 重定向但阻止直接访问 https stackoverflow com questions 45326795 mod rewrite redirect but prevent direct
  • 使用 CMake 和 conan 包管理器正确设置 Vulkan、glfw 和 spdlog

    我正在开发 Vulkan API 的渲染器 我在使用 CMake 和 conan 包管理器正确设置项目时遇到了很大的麻烦 让我们看一下我的 conanfile py 的依赖设置 from conans import ConanFile CM
  • 如何在Java中unpickle文件?

    我有一个由 Python 进程创建的 pickle 格式数据文件 实际上是 MCDungeon 缓存文件 我想从 Java 程序中读取此内容 为此 我使用了以下代码 public HashMap
  • 带图像的网格布局

    我正在尝试使用 HTML 和 CSS 为图像构建此网格布局 我想使用 div 而不是 table 但我不确定最好的方法是什么 我还需要在每张图片下面添加一个简短的描述 我使用浮动和padding bottom 底部填充用于模拟元素的高度 这
  • 在卸载之前将 AJAX 发送到服务器 [重复]

    这个问题在这里已经有答案了 所以据说从 Firefox gt 4 开始 https stackoverflow com questions 5398772 firefox 4 onbeforeunload custom message 将窗
  • 我需要帮助解码,这是 json 吗?

    这是json吗 我需要从中回显某些信息 但执行起来遇到困难 我尝试过json decode 但似乎不起作用 a 4 s 5 entry a 1 s 4 type s 10 individual s 5 group a 1 s 6 famil
  • 将二维数组分割成更小的二维数组

    有没有办法将 numpy 中的二维数组分割成更小的二维数组 Example 1 2 3 4 gt 1 2 3 4 5 6 7 8 5 6 7 8 所以我基本上想把一个 2x4 数组切成 2 个 2x2 数组 寻找用于图像的通用解决方案 有另
  • 根据另一列将值映射到特定列

    我有以下问题 A DataFrame含有col1带字符串A B or C 一秒col2与Integer 以及其他三栏col3 col4 and col5 这些列也被命名为A B and C Thus col1 col2 A col3 B c
  • 工作空间和工作目录是什么关系

    我一直在阅读有关 Perforce 的内容 但没有找到任何关于工作空间和工作目录之间关系的全面解释 例如文件如何出现在工作区的工作目录中 如何跟踪它们 工作区文件和工作目录文件之间可能存在哪些不一致等 我来自git背景 所以我正在寻找类似于
  • 子进程退出后内核复制 CoW 页面

    在Linux中 每当一个进程被fork时 父进程的内存映射都是cloned进入子进程 实际上 出于性能原因 页面被设置为写时复制 最初它们是共享的 如果两个进程之一在其中一个进程上写入 那么它们将被共享cloned MAP PRIVATE
  • 如何获取 WooCommerce 中的可用税率

    基于使用 WC Tax get tax classes 获取所有 WooCommerce 税级 https stackoverflow com questions 66196547 using wc taxget tax classes t
  • 在 Django 中设置外键属性的默认值

    为模型中的外键字段设置默认值的最佳方法是什么 假设我有两个模型 Student and Exam与学生有exam taken作为外键 理想情况下我该如何为其设置默认值 这是我的努力日志 class Student models Model
  • 即使在速度较慢的计算机上,也可以使用 CanvasCaptureMediaStream 以恒定的 fps 进行录制

    我想从 HTML 录制视频
  • TCL 面临的问题:在引号中列出元素,后跟“;”而不是空间

    我是 TCL 的新手 我正在尝试自学脚本 我正在尝试解析一个文件并尝试首先分隔每一行 然后将每一行分解为每个单词 然而 我的执行结束时给出了以下消息 DISPLAY output TDO list element in quotes fol
  • 观察新的系统通知 OSX

    是否可以监听 观察 macOS 收到的新通知 我的意思是当收到新的 iMessage 或 Slack 消息时 所以基本上导致通知中心显示通知的所有内容 简短回答 这是不可能的 除非应用程序提供特定的 API 否则您无法观察应用程序发送的用户
  • 使用 VLC 通过 RTP 流式传输桌面,延迟尽可能低

    我一直在尝试找出如何使用 VLC 流式传输我的桌面 通过 LAN 并实现尽可能低的延迟 我应该使用什么设置 我尝试了多种方法但尚未成功 编辑 我也愿意使用 VLC 以外的东西 我也用 VLC 尝试过同样的操作 但延迟始终无法低于 3 秒 F
  • Python 请求在发布数据时给出 415 错误

    我在将数据发布到服务器时收到 415 错误 这是我的代码 我该如何解决这个问题 提前致谢 import requests import json from requests auth import HTTPBasicAuth headers
  • 将参数传递给 JQuery 函数

    我正在使用一个包含 操作 列的循环创建 HTML 那一栏 是一个超链接 当用户单击时调用 JavaScript 函数并传递参数 example a href Click a a href Click a a href Click a a h
  • Identity Server 4 - 资源所有者密码授予和 Google 身份验证

    我有一个应用程序 当前使用资源所有者密码授予类型来允许用户通过单页应用程序登录 目前 身份服务器与 Web API 托管在同一项目中 但是 我们希望添加用户使用其 Google 帐户注册 登录的功能 目前 用户数据存储在表中并由 ASP N