使用身份服务器在 Azure 函数中获取用户信息和其他声明

Posted

技术标签:

【中文标题】使用身份服务器在 Azure 函数中获取用户信息和其他声明【英文标题】:Get user info and other claims in Azure Function with Identity server 【发布时间】:2020-12-13 20:54:18 【问题描述】:

我有一个应用程序,其中使用 IdentityServer4 和 Azure AD 作为 OpenID 提供程序来完成身份验证。 IdentityServer4 托管在 Azure 应用服务中。身份验证成功后,我可以在 Angular 应用程序中获取访问令牌。访问令牌被传递到托管在 Azure Function 3.x 中的基于 .Net Core 的 RESTful API。 在我的 Azure 函数中,我想在不到达 IdentityServer4 的端点“/connect/userinfo”的情况下获取用户信息和其他声明。

类似于以下获取声明的内容会有所帮助

[FunctionName("MyFunctionName")]
public static HttpResponseMessage Run(
            [HttpTrigger(
                AuthorizationLevel.Anonymous,
                "get", "post",
                Route = "MyFunctionName")]HttpRequestMessage req, 
            ILogger log, 
            ClaimsPrincipal claimsPrincipal)

    // My function code here...

如何在 Azure 函数中获取用户信息和其他声明,其中身份验证由 IdentityServer4 完成,Azure AD 作为 OpenID 提供程序

【问题讨论】:

【参考方案1】:

如果您不想点击 Identity Server 的用户信息端点来获取用户信息和其他声明,则需要执行以下操作。

    将声明信息添加到授权令牌中 解析授权令牌并提取用户信息和其他声明信息。

这种方法的缺点是令牌大小增加,但优点是您不需要点击 userinfo 端点来保存您的 http 请求。因此,每种方法之间都需要权衡取舍。

以下是在 Identity Server 中配置 api 时添加声明信息的方法。如果您使用了 Identity Server 模板,则此信息通常位于 Config.cs 中

public static IEnumerable<ApiResource> GetApis()
    
        var apiResourceList = new List<ApiResource>
        
                new ApiResource(IdentityServerConstants.LocalApi.ScopeName)
                 
                    UserClaims =
                    
                        JwtClaimTypes.Email,
                        JwtClaimTypes.PhoneNumber,
                        JwtClaimTypes.GivenName,
                        JwtClaimTypes.FamilyName,
                        JwtClaimTypes.PreferredUserName
                    ,                      
                
                
        ;          
        return apiResourceList;
    

要解析和验证令牌,请关注博客Manual token validation in Azure Function

这个*** thread也很有用。

【讨论】:

【参考方案2】:

如果您拥有有效的访问令牌,则您可以自行向 UserInfo 端点发出请求,以检索剩余的用户详细信息。

阅读更多关于它的信息here

如果您不想访问 userinfo 端点,唯一的选择是直接在令牌中包含所需的数据。在这里,您需要在代币大小与便利性之间进行权衡。然后你得到一个真正无状态的系统。

【讨论】:

我想在 Azure Function 中访问此信息。为每个 Http 请求点击 /userinfo 端点并不是一个好主意。应该有某种机制可以让我在不到达终点的情况下访问用户信息。

以上是关于使用身份服务器在 Azure 函数中获取用户信息和其他声明的主要内容,如果未能解决你的问题,请参考以下文章

使用 ASP.NET 标识和 JWT 令牌的 Azure 函数身份验证

实现 JWT 身份验证 Azure Function 3.x - 使用 JWT 令牌获取当前用户的声明

使用 Xamarin android 和 azure facebook 身份验证获取用户个人资料/详细信息时出错

如何在 Azure 移动 Web 应用中获取基本用户信息?

Azure 使用 Azure 函数保护 WCF asmx

在 keycloak id_token 中获取 Azure 组信息