使用Identity Server获取Azure Function中的用户信息和其他声明

问题描述

我有一个应用程序,其中使用IdentityServer4和Azure AD作为OpenID提供程序来完成身份验证。 IdentityServer4托管在Azure App服务中。成功通过身份验证后,我可以在Angular应用程序中获取访问令牌。访问令牌被传递到基于.Net Core的RESTful API,该API托管在 Azure Function 3.x 中。 在我的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提供程序进行身份验证来获取用户信息和其他声明

解决方法

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

详细了解here

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

,

如果您不想访问Identity Server的用户信息端点来获取用户信息和其他声明,则需要这样做。

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

此方法的缺点是令牌大小增加了,但是优点是您不需要击中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

StackOverflow thread也非常有用。