ClaimsPrincipal / UserProfile 的 Azure Functions 自定义绑定

Azure Functions Custom Binding for ClaimsPrincipal / UserProfile

有没有办法使用自定义实体将 Azure Functions 与 Azure Active Directory 集成一起使用?

我正在尝试集成一个简单的 Angular 应用程序和 azure 功能 我认为这会非常简单,但事实并非如此。目前使用 MSAL,Angular 应用程序正在将 Bearer 令牌发送到 azure 函数,但对于本地 ClaimsPrincipal 是管理员。

一个选项是使用 ClaimsPrincipal 作为基础 class 并绑定 ctor 中的其他数据。但我不确定这项工作是否也不确定我必须从基础 ClaimsPrincipal.

使用哪个 ctor
public class UserProfile: ClaimsPrincipal
{
    public UserProfile() 
    {
        //load other data
    }
}

另一种选择是使用 ClaimsPrincipal 作为 属性 类型完全自定义模型绑定。

public class UserProfile
{
    public UserProfile() 
    {
        //load other data
    }

    public ClaimsPrincipal Principal {get; set; }
}

但当我尝试研究自定义绑定时,甚至不确定它们中的任何一个是否可行它总是 [FromBody] customObj 用法。

我设法使用 github 为 Azure WebJobs Extentions 添加自定义值绑定。不确定它是否违反任何规则或原则,但对我来说很好。

首先定义你自己的对象来绑定假设 UserProfileAD 并复制 ClaimsPrincipalBindingProvider 内容并相应地更新,例如将每个 ClaimsPrincipal 更改为新类型,并在其中设置值以您自己的方式处理。新的 BindingProvider (UserProfileADBindingProvider) 是您可以注入其他服务的地方,因此您可以访问数据库。

但是这里有一个问题,class 中使用的每个 class 都被定义为内部的,因此您的新 class 无法访问它们,因此还需要复制 HttpTriggerAttributeBindingProvider, StreamValueBinder, ValueBinder

另外,由于另一个访问问题,将 HttpTriggerAttributeBindingProvider 中的 IsRequestPayloadReadable 更改为以下内容。

        private bool IsRequestPayloadReadable(HttpRequest request)
        {
            return (request.Body != null && request.ContentLength > 0)
                || (_options != null && string.Equals(request.Headers[HeaderNames.TransferEncoding], "chunked", StringComparison.OrdinalIgnoreCase));
        }

并在 Startup Configure 方法中将新的 BindingProvider 添加到 webjobs 服务,如下所示;

var wbBuilder = builder.Services.AddWebJobs(x => { return; });

wbBuilder.Services.AddSingleton<IBindingProvider, UserProfileADBindingProvider>();