
关于
Microsoft Entra 认证事件 .NET SDK。用于自定义认证扩展的 Azure Functions 触发器。
name: microsoft-azure-webjobs-extensions-authentication-events-dotnet description: Microsoft Entra 认证事件 SDK for .NET。用于自定义认证扩展的 Azure Functions 触发器。 risk: unknown source: community date_added: '2026-02-27'
Microsoft.Azure.WebJobs.Extensions.AuthenticationEvents (.NET)
用于处理 Microsoft Entra ID 自定义认证事件的 Azure Functions 扩展。
安装
dotnet add package Microsoft.Azure.WebJobs.Extensions.AuthenticationEvents
当前版本:v1.1.0(稳定版)
支持的事件
| 事件 | 用途 |
|------|------|
| OnTokenIssuanceStart | 在令牌签发期间添加自定义声明 |
| OnAttributeCollectionStart | 在显示前自定义属性收集 UI |
| OnAttributeCollectionSubmit | 在用户提交后验证/修改属性 |
| OnOtpSend | 自定义 OTP 发送(短信、邮件等) |
核心工作流
1. 令牌丰富(添加自定义声明)
在登录期间向访问令牌或 ID 令牌添加自定义声明。
using Microsoft.Azure.WebJobs;
using Microsoft.Azure.WebJobs.Extensions.AuthenticationEvents;
using Microsoft.Azure.WebJobs.Extensions.AuthenticationEvents.TokenIssuanceStart;
using Microsoft.Extensions.Logging;
public static class TokenEnrichmentFunction
{
[FunctionName("OnTokenIssuanceStart")]
public static WebJobsAuthenticationEventResponse Run(
[WebJobsAuthenticationEventsTrigger] WebJobsTokenIssuanceStartRequest request,
ILogger log)
{
log.LogInformation("Token issuance event for user: {UserId}",
request.Data?.AuthenticationContext?.User?.Id);
// Create response with custom claims
var response = new WebJobsTokenIssuanceStartResponse();
// Add claims to the token
response.Actions.Add(new WebJobsProvideClaimsForToken
{
Claims = new Dictionary<string, string>
{
{ "customClaim1", "customValue1" },
{ "department", "Engineering" },
{ "costCenter", "CC-12345" },
{ "apiVersion", "v2" }
}
});
return response;
}
}
2. 使用外部数据丰富令牌
从外部系统(数据库、API)获取声明。
using Microsoft.Azure.WebJobs;
using Microsoft.Azure.WebJobs.Extensions.AuthenticationEvents;
using Microsoft.Azure.WebJobs.Extensions.AuthenticationEvents.TokenIssuanceStart;
using Microsoft.Extensions.Logging;
using System.Net.Http;
using System.Text.Json;
public static class TokenEnrichmentWithExternalData
{
private static readonly HttpClient _httpClient = new();
[FunctionName("OnTokenIssuanceStartExternal")]
public static async Task<WebJobsAuthenticationEventResponse> Run(
[WebJobsAuthenticationEventsTrigger] WebJobsTokenIssuanceStartRequest request,
ILogger log)
{
string? userId = request.Data?.AuthenticationContext?.User?.Id;
if (string.IsNullOrEmpty(userId))
{
log.LogWarning("No user ID in request");
return new WebJobsTokenIssuanceStartResponse();
}
// Fetch user data from external API
var userProfile = await GetUserProfileAsync(userId);
var response = new WebJobsTokenIssuanceStartResponse();
response.Actions.Add(new WebJobsProvideClaimsForToken
{
Claims = new Dictionary<string, string>
{
{ "employeeId", userProfile.EmployeeId },
{ "department", userProfile.Department },
{ "roles", string.Join(",", userProfile.Roles) }
}
});
return response;
}
private static async Task<UserProfile> GetUserProfileAsync(string userId)
{
var response = await _httpClient.GetAsync($"https://api.example.com/users/{userId}");
response.EnsureSuccessStatusCode();
var json = await response.Content.ReadAsStringAsync();
return JsonSerializer.Deserialize<UserProfile>(json)!;
}
}
public record UserProfile(string EmployeeId, string Department, string[] Roles);
3. 属性收集 - 自定义 UI(开始事件)
在属性收集页面显示前进行自定义。
兼容工具
Claude CodeCursor
标签
前端开发