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>();
有没有办法使用自定义实体将 Azure Functions 与 Azure Active Directory 集成一起使用?
我正在尝试集成一个简单的 Angular 应用程序和 azure 功能 我认为这会非常简单,但事实并非如此。目前使用 MSAL,Angular 应用程序正在将 Bearer 令牌发送到 azure 函数,但对于本地 ClaimsPrincipal
是管理员。
一个选项是使用 ClaimsPrincipal
作为基础 class 并绑定 ctor 中的其他数据。但我不确定这项工作是否也不确定我必须从基础 ClaimsPrincipal
.
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>();