{"id":"93c241ff-3699-41fd-92bd-e5cd0f98b423","shortId":"Pb9Hyq","kind":"skill","title":"microsoft-azure-webjobs-extensions-authentication-events-dotnet","tagline":"Microsoft Entra Authentication Events SDK for .NET. Azure Functions triggers for custom authentication extensions.","description":"# Microsoft.Azure.WebJobs.Extensions.AuthenticationEvents (.NET)\n\nAzure Functions extension for handling Microsoft Entra ID custom authentication events.\n\n## Installation\n\n```bash\ndotnet add package Microsoft.Azure.WebJobs.Extensions.AuthenticationEvents\n```\n\n**Current Version**: v1.1.0 (stable)\n\n## Supported Events\n\n| Event | Purpose |\n|-------|---------|\n| `OnTokenIssuanceStart` | Add custom claims to tokens during issuance |\n| `OnAttributeCollectionStart` | Customize attribute collection UI before display |\n| `OnAttributeCollectionSubmit` | Validate/modify attributes after user submission |\n| `OnOtpSend` | Custom OTP delivery (SMS, email, etc.) |\n\n## Core Workflows\n\n### 1. Token Enrichment (Add Custom Claims)\n\nAdd custom claims to access or ID tokens during sign-in.\n\n```csharp\nusing Microsoft.Azure.WebJobs;\nusing Microsoft.Azure.WebJobs.Extensions.AuthenticationEvents;\nusing Microsoft.Azure.WebJobs.Extensions.AuthenticationEvents.TokenIssuanceStart;\nusing Microsoft.Extensions.Logging;\n\npublic static class TokenEnrichmentFunction\n{\n    [FunctionName(\"OnTokenIssuanceStart\")]\n    public static WebJobsAuthenticationEventResponse Run(\n        [WebJobsAuthenticationEventsTrigger] WebJobsTokenIssuanceStartRequest request,\n        ILogger log)\n    {\n        log.LogInformation(\"Token issuance event for user: {UserId}\", \n            request.Data?.AuthenticationContext?.User?.Id);\n\n        // Create response with custom claims\n        var response = new WebJobsTokenIssuanceStartResponse();\n        \n        // Add claims to the token\n        response.Actions.Add(new WebJobsProvideClaimsForToken\n        {\n            Claims = new Dictionary<string, string>\n            {\n                { \"customClaim1\", \"customValue1\" },\n                { \"department\", \"Engineering\" },\n                { \"costCenter\", \"CC-12345\" },\n                { \"apiVersion\", \"v2\" }\n            }\n        });\n\n        return response;\n    }\n}\n```\n\n### 2. Token Enrichment with External Data\n\nFetch claims from external systems (databases, APIs).\n\n```csharp\nusing Microsoft.Azure.WebJobs;\nusing Microsoft.Azure.WebJobs.Extensions.AuthenticationEvents;\nusing Microsoft.Azure.WebJobs.Extensions.AuthenticationEvents.TokenIssuanceStart;\nusing Microsoft.Extensions.Logging;\nusing System.Net.Http;\nusing System.Text.Json;\n\npublic static class TokenEnrichmentWithExternalData\n{\n    private static readonly HttpClient _httpClient = new();\n\n    [FunctionName(\"OnTokenIssuanceStartExternal\")]\n    public static async Task<WebJobsAuthenticationEventResponse> Run(\n        [WebJobsAuthenticationEventsTrigger] WebJobsTokenIssuanceStartRequest request,\n        ILogger log)\n    {\n        string? userId = request.Data?.AuthenticationContext?.User?.Id;\n        \n        if (string.IsNullOrEmpty(userId))\n        {\n            log.LogWarning(\"No user ID in request\");\n            return new WebJobsTokenIssuanceStartResponse();\n        }\n\n        // Fetch user data from external API\n        var userProfile = await GetUserProfileAsync(userId);\n        \n        var response = new WebJobsTokenIssuanceStartResponse();\n        response.Actions.Add(new WebJobsProvideClaimsForToken\n        {\n            Claims = new Dictionary<string, string>\n            {\n                { \"employeeId\", userProfile.EmployeeId },\n                { \"department\", userProfile.Department },\n                { \"roles\", string.Join(\",\", userProfile.Roles) }\n            }\n        });\n\n        return response;\n    }\n\n    private static async Task<UserProfile> GetUserProfileAsync(string userId)\n    {\n        var response = await _httpClient.GetAsync($\"https://api.example.com/users/{userId}\");\n        response.EnsureSuccessStatusCode();\n        var json = await response.Content.ReadAsStringAsync();\n        return JsonSerializer.Deserialize<UserProfile>(json)!;\n    }\n}\n\npublic record UserProfile(string EmployeeId, string Department, string[] Roles);\n```\n\n### 3. Attribute Collection - Customize UI (Start Event)\n\nCustomize the attribute collection page before it's displayed.\n\n```csharp\nusing Microsoft.Azure.WebJobs;\nusing Microsoft.Azure.WebJobs.Extensions.AuthenticationEvents;\nusing Microsoft.Azure.WebJobs.Extensions.AuthenticationEvents.Framework;\nusing Microsoft.Extensions.Logging;\n\npublic static class AttributeCollectionStartFunction\n{\n    [FunctionName(\"OnAttributeCollectionStart\")]\n    public static WebJobsAuthenticationEventResponse Run(\n        [WebJobsAuthenticationEventsTrigger] WebJobsAttributeCollectionStartRequest request,\n        ILogger log)\n    {\n        log.LogInformation(\"Attribute collection start for correlation: {CorrelationId}\",\n            request.Data?.AuthenticationContext?.CorrelationId);\n\n        var response = new WebJobsAttributeCollectionStartResponse();\n\n        // Option 1: Continue with default behavior\n        response.Actions.Add(new WebJobsContinueWithDefaultBehavior());\n\n        // Option 2: Prefill attributes\n        // response.Actions.Add(new WebJobsSetPrefillValues\n        // {\n        //     Attributes = new Dictionary<string, string>\n        //     {\n        //         { \"city\", \"Seattle\" },\n        //         { \"country\", \"USA\" }\n        //     }\n        // });\n\n        // Option 3: Show blocking page (prevent sign-up)\n        // response.Actions.Add(new WebJobsShowBlockPage\n        // {\n        //     Message = \"Sign-up is currently disabled.\"\n        // });\n\n        return response;\n    }\n}\n```\n\n### 4. Attribute Collection - Validate Submission (Submit Event)\n\nValidate and modify attributes after user submission.\n\n```csharp\nusing Microsoft.Azure.WebJobs;\nusing Microsoft.Azure.WebJobs.Extensions.AuthenticationEvents;\nusing Microsoft.Azure.WebJobs.Extensions.AuthenticationEvents.Framework;\nusing Microsoft.Extensions.Logging;\n\npublic static class AttributeCollectionSubmitFunction\n{\n    [FunctionName(\"OnAttributeCollectionSubmit\")]\n    public static WebJobsAuthenticationEventResponse Run(\n        [WebJobsAuthenticationEventsTrigger] WebJobsAttributeCollectionSubmitRequest request,\n        ILogger log)\n    {\n        var response = new WebJobsAttributeCollectionSubmitResponse();\n\n        // Access submitted attributes\n        var attributes = request.Data?.UserSignUpInfo?.Attributes;\n        \n        string? email = attributes?[\"email\"]?.ToString();\n        string? displayName = attributes?[\"displayName\"]?.ToString();\n\n        // Validation example: block certain email domains\n        if (email?.EndsWith(\"@blocked.com\") == true)\n        {\n            response.Actions.Add(new WebJobsShowBlockPage\n            {\n                Message = \"Sign-up from this email domain is not allowed.\"\n            });\n            return response;\n        }\n\n        // Validation example: show validation error\n        if (string.IsNullOrEmpty(displayName) || displayName.Length < 3)\n        {\n            response.Actions.Add(new WebJobsShowValidationError\n            {\n                Message = \"Display name must be at least 3 characters.\",\n                AttributeErrors = new Dictionary<string, string>\n                {\n                    { \"displayName\", \"Name is too short\" }\n                }\n            });\n            return response;\n        }\n\n        // Modify attributes before saving\n        response.Actions.Add(new WebJobsModifyAttributeValues\n        {\n            Attributes = new Dictionary<string, string>\n            {\n                { \"displayName\", displayName.Trim() },\n                { \"city\", attributes?[\"city\"]?.ToString()?.ToUpperInvariant() ?? \"\" }\n            }\n        });\n\n        return response;\n    }\n}\n```\n\n### 5. Custom OTP Delivery\n\nSend one-time passwords via custom channels (SMS, email, push notification).\n\n```csharp\nusing Microsoft.Azure.WebJobs;\nusing Microsoft.Azure.WebJobs.Extensions.AuthenticationEvents;\nusing Microsoft.Azure.WebJobs.Extensions.AuthenticationEvents.Framework;\nusing Microsoft.Extensions.Logging;\n\npublic static class CustomOtpFunction\n{\n    [FunctionName(\"OnOtpSend\")]\n    public static async Task<WebJobsAuthenticationEventResponse> Run(\n        [WebJobsAuthenticationEventsTrigger] WebJobsOnOtpSendRequest request,\n        ILogger log)\n    {\n        var response = new WebJobsOnOtpSendResponse();\n\n        string? phoneNumber = request.Data?.OtpContext?.Identifier;\n        string? otp = request.Data?.OtpContext?.OneTimeCode;\n\n        if (string.IsNullOrEmpty(phoneNumber) || string.IsNullOrEmpty(otp))\n        {\n            log.LogError(\"Missing phone number or OTP\");\n            response.Actions.Add(new WebJobsOnOtpSendFailed\n            {\n                Error = \"Missing required data\"\n            });\n            return response;\n        }\n\n        try\n        {\n            // Send OTP via your SMS provider\n            await SendSmsAsync(phoneNumber, $\"Your verification code is: {otp}\");\n            \n            response.Actions.Add(new WebJobsOnOtpSendSuccess());\n            log.LogInformation(\"OTP sent successfully to {PhoneNumber}\", phoneNumber);\n        }\n        catch (Exception ex)\n        {\n            log.LogError(ex, \"Failed to send OTP\");\n            response.Actions.Add(new WebJobsOnOtpSendFailed\n            {\n                Error = \"Failed to send verification code\"\n            });\n        }\n\n        return response;\n    }\n\n    private static async Task SendSmsAsync(string phoneNumber, string message)\n    {\n        // Implement your SMS provider integration (Twilio, Azure Communication Services, etc.)\n        await Task.CompletedTask;\n    }\n}\n```\n\n### 6. Function App Configuration\n\nConfigure the Function App for authentication events.\n\n```csharp\n// Program.cs (Isolated worker model)\nusing Microsoft.Extensions.Hosting;\n\nvar host = new HostBuilder()\n    .ConfigureFunctionsWorkerDefaults()\n    .Build();\n\nhost.Run();\n```\n\n```json\n// host.json\n{\n  \"version\": \"2.0\",\n  \"logging\": {\n    \"applicationInsights\": {\n      \"samplingSettings\": {\n        \"isEnabled\": true\n      }\n    }\n  },\n  \"extensions\": {\n    \"http\": {\n      \"routePrefix\": \"\"\n    }\n  }\n}\n```\n\n```json\n// local.settings.json\n{\n  \"IsEncrypted\": false,\n  \"Values\": {\n    \"AzureWebJobsStorage\": \"UseDevelopmentStorage=true\",\n    \"FUNCTIONS_WORKER_RUNTIME\": \"dotnet\"\n  }\n}\n```\n\n## Key Types Reference\n\n| Type | Purpose |\n|------|---------|\n| `WebJobsAuthenticationEventsTriggerAttribute` | Function trigger attribute |\n| `WebJobsTokenIssuanceStartRequest` | Token issuance event request |\n| `WebJobsTokenIssuanceStartResponse` | Token issuance event response |\n| `WebJobsProvideClaimsForToken` | Action to add claims |\n| `WebJobsAttributeCollectionStartRequest` | Attribute collection start request |\n| `WebJobsAttributeCollectionStartResponse` | Attribute collection start response |\n| `WebJobsAttributeCollectionSubmitRequest` | Attribute submission request |\n| `WebJobsAttributeCollectionSubmitResponse` | Attribute submission response |\n| `WebJobsSetPrefillValues` | Prefill form values |\n| `WebJobsShowBlockPage` | Block user with message |\n| `WebJobsShowValidationError` | Show validation errors |\n| `WebJobsModifyAttributeValues` | Modify submitted values |\n| `WebJobsOnOtpSendRequest` | OTP send event request |\n| `WebJobsOnOtpSendResponse` | OTP send event response |\n| `WebJobsOnOtpSendSuccess` | OTP sent successfully |\n| `WebJobsOnOtpSendFailed` | OTP send failed |\n| `WebJobsContinueWithDefaultBehavior` | Continue with default flow |\n\n## Entra ID Configuration\n\nAfter deploying your Function App, configure the custom extension in Entra ID:\n\n1. **Register the API** in Entra ID → App registrations\n2. **Create Custom Authentication Extension** in Entra ID → External Identities → Custom authentication extensions\n3. **Link to User Flow** in Entra ID → External Identities → User flows\n\n### Required App Registration Settings\n\n```\nExpose an API:\n  - Application ID URI: api://<your-function-app-name>.azurewebsites.net\n  - Scope: CustomAuthenticationExtension.Receive.Payload\n\nAPI Permissions:\n  - Microsoft Graph: User.Read (delegated)\n```\n\n## Best Practices\n\n1. **Validate all inputs** — Never trust request data; validate before processing\n2. **Handle errors gracefully** — Return appropriate error responses\n3. **Log correlation IDs** — Use `CorrelationId` for troubleshooting\n4. **Keep functions fast** — Authentication events have timeout limits\n5. **Use managed identity** — Access Azure resources securely\n6. **Cache external data** — Avoid slow lookups on every request\n7. **Test locally** — Use Azure Functions Core Tools with sample payloads\n8. **Monitor with App Insights** — Track function execution and errors\n\n## Error Handling\n\n```csharp\n[FunctionName(\"OnTokenIssuanceStart\")]\npublic static WebJobsAuthenticationEventResponse Run(\n    [WebJobsAuthenticationEventsTrigger] WebJobsTokenIssuanceStartRequest request,\n    ILogger log)\n{\n    try\n    {\n        // Your logic here\n        var response = new WebJobsTokenIssuanceStartResponse();\n        response.Actions.Add(new WebJobsProvideClaimsForToken\n        {\n            Claims = new Dictionary<string, string> { { \"claim\", \"value\" } }\n        });\n        return response;\n    }\n    catch (Exception ex)\n    {\n        log.LogError(ex, \"Error processing token issuance event\");\n        \n        // Return empty response - authentication continues without custom claims\n        // Do NOT throw - this would fail the authentication\n        return new WebJobsTokenIssuanceStartResponse();\n    }\n}\n```\n\n## Related SDKs\n\n| SDK | Purpose | Install |\n|-----|---------|---------|\n| `Microsoft.Azure.WebJobs.Extensions.AuthenticationEvents` | Auth events (this SDK) | `dotnet add package Microsoft.Azure.WebJobs.Extensions.AuthenticationEvents` |\n| `Microsoft.Identity.Web` | Web app authentication | `dotnet add package Microsoft.Identity.Web` |\n| `Azure.Identity` | Azure authentication | `dotnet add package Azure.Identity` |\n\n## Reference Links\n\n| Resource | URL |\n|----------|-----|\n| NuGet Package | https://www.nuget.org/packages/Microsoft.Azure.WebJobs.Extensions.AuthenticationEvents |\n| Custom Extensions Overview | https://learn.microsoft.com/entra/identity-platform/custom-extension-overview |\n| Token Issuance Events | https://learn.microsoft.com/entra/identity-platform/custom-extension-tokenissuancestart-setup |\n| Attribute Collection Events | https://learn.microsoft.com/entra/identity-platform/custom-extension-attribute-collection |\n| GitHub Source | https://github.com/Azure/azure-sdk-for-net/tree/main/sdk/entra/Microsoft.Azure.WebJobs.Extensions.AuthenticationEvents |\n\n## When to Use\nThis skill is applicable to execute the workflow or actions described in the overview.\n\n## Limitations\n- Use this skill only when the task clearly matches the scope described above.\n- Do not treat the output as a substitute for environment-specific validation, testing, or expert review.\n- Stop and ask for clarification if required inputs, permissions, safety boundaries, or success criteria are missing.","tags":["microsoft","azure","webjobs","extensions","authentication","events","dotnet","antigravity","awesome","skills","sickn33","agent-skills"],"capabilities":["skill","source-sickn33","skill-microsoft-azure-webjobs-extensions-authentication-events-dotnet","topic-agent-skills","topic-agentic-skills","topic-ai-agent-skills","topic-ai-agents","topic-ai-coding","topic-ai-workflows","topic-antigravity","topic-antigravity-skills","topic-claude-code","topic-claude-code-skills","topic-codex-cli","topic-codex-skills"],"categories":["antigravity-awesome-skills"],"synonyms":[],"warnings":[],"endpointUrl":"https://skills.sh/sickn33/antigravity-awesome-skills/microsoft-azure-webjobs-extensions-authentication-events-dotnet","protocol":"skill","transport":"skills-sh","auth":{"type":"none","details":{"cli":"npx skills add sickn33/antigravity-awesome-skills","source_repo":"https://github.com/sickn33/antigravity-awesome-skills","install_from":"skills.sh"}},"qualityScore":"0.700","qualityRationale":"deterministic score 0.70 from registry signals: · indexed on github topic:agent-skills · 34666 github stars · SKILL.md body (14,888 chars)","verified":false,"liveness":"unknown","lastLivenessCheck":null,"agentReviews":{"count":0,"score_avg":null,"cost_usd_avg":null,"success_rate":null,"latency_p50_ms":null,"narrative_summary":null,"summary_updated_at":null},"enrichmentModel":"deterministic:skill-github:v1","enrichmentVersion":1,"enrichedAt":"2026-04-23T06:51:33.619Z","embedding":null,"createdAt":"2026-04-18T21:40:45.598Z","updatedAt":"2026-04-23T06:51:33.619Z","lastSeenAt":"2026-04-23T06:51:33.619Z","tsv":"'-12345':161 '/azure/azure-sdk-for-net/tree/main/sdk/entra/microsoft.azure.webjobs.extensions.authenticationevents':1078 '/entra/identity-platform/custom-extension-attribute-collection':1073 '/entra/identity-platform/custom-extension-overview':1061 '/entra/identity-platform/custom-extension-tokenissuancestart-setup':1067 '/packages/microsoft.azure.webjobs.extensions.authenticationevents':1055 '/users/':277 '1':80,351,825,880 '2':166,360,834,891 '2.0':707 '3':296,376,492,503,847,899 '4':396,907 '5':538,916 '6':679,924 '7':934 '8':945 'access':90,438,920 'action':748,1091 'add':39,51,83,86,142,750,1029,1037,1044 'allow':480 'api':178,237,828,865,872 'api.example.com':276 'api.example.com/users/':275 'apivers':162 'app':681,686,817,832,860,948,1034 'applic':866,1085 'applicationinsight':709 'appropri':896 'ask':1129 'async':206,266,571,660 'attribut':60,67,297,305,337,362,366,397,406,440,442,445,448,453,518,524,532,736,753,758,763,767,1068 'attributecollectionstartfunct':324 'attributecollectionsubmitfunct':422 'attributeerror':505 'auth':1024 'authent':6,11,21,34,688,837,845,911,1002,1014,1035,1042 'authenticationcontext':130,217,344 'avoid':928 'await':240,273,282,620,677 'azur':3,16,25,673,921,938,1041 'azure.identity':1040,1046 'azurewebjobsstorag':721 'azurewebsites.net':869 'bash':37 'behavior':355 'best':878 'block':378,458,775 'blocked.com':465 'boundari':1137 'build':702 'cach':925 'catch':638,989 'cc':160 'certain':459 'channel':549 'charact':504 'citi':371,531,533 'claim':53,85,88,137,143,150,173,250,751,980,985,1006 'clarif':1131 'class':109,194,323,421,565 'clear':1104 'code':625,655 'collect':61,298,306,338,398,754,759,1069 'communic':674 'configur':682,683,812,818 'configurefunctionsworkerdefault':701 'continu':352,806,1003 'core':78,940 'correl':341,901 'correlationid':342,345,904 'costcent':159 'countri':373 'creat':133,835 'criteria':1140 'csharp':98,179,312,410,554,690,957 'current':42,392 'custom':20,33,52,59,72,84,87,136,299,303,539,548,820,836,844,1005,1056 'customauthenticationextension.receive.payload':871 'customclaim1':155 'customotpfunct':566 'customvalue1':156 'data':171,234,610,887,927 'databas':177 'default':354,808 'deleg':877 'deliveri':74,541 'depart':157,257,293 'deploy':814 'describ':1092,1108 'dictionari':152,252,368,507,526,982 'disabl':393 'display':64,311,497 'displaynam':452,454,490,510,529 'displayname.length':491 'displayname.trim':530 'domain':461,477 'dotnet':8,38,727,1028,1036,1043 'email':76,447,449,460,463,476,551 'employeeid':255,291 'empti':1000 'endswith':464 'engin':158 'enrich':82,168 'entra':10,31,810,823,830,840,853 'environ':1120 'environment-specif':1119 'error':487,607,650,782,893,897,954,955,994 'etc':77,676 'event':7,12,35,47,48,125,302,402,689,740,745,790,795,912,998,1025,1064,1070 'everi':932 'ex':640,642,991,993 'exampl':457,484 'except':639,990 'execut':952,1087 'expert':1125 'expos':863 'extens':5,22,27,713,821,838,846,1057 'extern':170,175,236,842,855,926 'fail':643,651,804,1012 'fals':719 'fast':910 'fetch':172,232 'flow':809,851,858 'form':772 'function':17,26,680,685,724,734,816,909,939,951 'functionnam':111,202,325,423,567,958 'getuserprofileasync':241,268 'github':1074 'github.com':1077 'github.com/azure/azure-sdk-for-net/tree/main/sdk/entra/microsoft.azure.webjobs.extensions.authenticationevents':1076 'grace':894 'graph':875 'handl':29,892,956 'host':698 'host.json':705 'host.run':703 'hostbuild':700 'http':714 'httpclient':199,200 'httpclient.getasync':274 'id':32,92,132,219,226,811,824,831,841,854,867,902 'ident':843,856,919 'identifi':587 'ilogg':120,212,334,432,577,967 'implement':667 'input':883,1134 'insight':949 'instal':36,1022 'integr':671 'isen':711 'isencrypt':718 'isol':692 'issuanc':57,124,739,744,997,1063 'json':281,286,704,716 'jsonserializer.deserialize':285 'keep':908 'key':728 'learn.microsoft.com':1060,1066,1072 'learn.microsoft.com/entra/identity-platform/custom-extension-attribute-collection':1071 'learn.microsoft.com/entra/identity-platform/custom-extension-overview':1059 'learn.microsoft.com/entra/identity-platform/custom-extension-tokenissuancestart-setup':1065 'least':502 'limit':915,1096 'link':848,1048 'local':936 'local.settings.json':717 'log':121,213,335,433,578,708,900,968 'log.logerror':598,641,992 'log.loginformation':122,336,631 'log.logwarning':223 'logic':971 'lookup':930 'manag':918 'match':1105 'messag':387,470,496,666,778 'microsoft':2,9,30,874 'microsoft-azure-webjobs-extensions-authentication-events-dotnet':1 'microsoft.azure.webjobs':100,181,314,412,556 'microsoft.azure.webjobs.extensions.authenticationevents':23,41,102,183,316,414,558,1023,1031 'microsoft.azure.webjobs.extensions.authenticationevents.framework':318,416,560 'microsoft.azure.webjobs.extensions.authenticationevents.tokenissuancestart':104,185 'microsoft.extensions.hosting':696 'microsoft.extensions.logging':106,187,320,418,562 'microsoft.identity.web':1032,1039 'miss':599,608,1142 'model':694 'modifi':405,517,784 'monitor':946 'must':499 'name':498,511 'net':15,24 'never':884 'new':140,148,151,201,230,245,248,251,348,357,364,367,385,436,468,494,506,522,525,581,605,629,648,699,975,978,981,1016 'notif':553 'nuget':1051 'number':601 'onattributecollectionstart':58,326 'onattributecollectionsubmit':65,424 'one':544 'one-tim':543 'onetimecod':592 'onotpsend':71,568 'ontokenissuancestart':50,112,959 'ontokenissuancestartextern':203 'option':350,359,375 'otp':73,540,589,597,603,615,627,632,646,788,793,798,802 'otpcontext':586,591 'output':1114 'overview':1058,1095 'packag':40,1030,1038,1045,1052 'page':307,379 'password':546 'payload':944 'permiss':873,1135 'phone':600 'phonenumb':584,595,622,636,637,664 'practic':879 'prefil':361,771 'prevent':380 'privat':196,264,658 'process':890,995 'program.cs':691 'provid':619,670 'public':107,113,192,204,287,321,327,419,425,563,569,960 'purpos':49,732,1021 'push':552 'readon':198 'record':288 'refer':730,1047 'regist':826 'registr':833,861 'relat':1018 'request':119,211,228,333,431,576,741,756,765,791,886,933,966 'request.data':129,216,343,443,585,590 'requir':609,859,1133 'resourc':922,1049 'respons':134,139,165,244,263,272,347,395,435,482,516,537,580,612,657,746,761,769,796,898,974,988,1001 'response.actions.add':147,247,356,363,384,467,493,521,604,628,647,977 'response.content.readasstringasync':283 'response.ensuresuccessstatuscode':279 'return':164,229,262,284,394,481,515,536,611,656,895,987,999,1015 'review':1126 'role':259,295 'routeprefix':715 'run':116,208,330,428,573,963 'runtim':726 'safeti':1136 'sampl':943 'samplingset':710 'save':520 'scope':870,1107 'sdk':13,1020,1027 'sdks':1019 'seattl':372 'secur':923 'send':542,614,645,653,789,794,803 'sendsmsasync':621,662 'sent':633,799 'servic':675 'set':862 'short':514 'show':377,485,780 'sign':96,382,389,472 'sign-in':95 'sign-up':381,388,471 'skill':1083,1099 'skill-microsoft-azure-webjobs-extensions-authentication-events-dotnet' 'slow':929 'sms':75,550,618,669 'sourc':1075 'source-sickn33' 'specif':1121 'stabl':45 'start':301,339,755,760 'static':108,114,193,197,205,265,322,328,420,426,564,570,659,961 'stop':1127 'string':153,154,214,253,254,269,290,292,294,369,370,446,451,508,509,527,528,583,588,663,665,983,984 'string.isnullorempty':221,489,594,596 'string.join':260 'submiss':70,400,409,764,768 'submit':401,439,785 'substitut':1117 'success':634,800,1139 'support':46 'system':176 'system.net.http':189 'system.text.json':191 'task':207,267,572,661,1103 'task.completedtask':678 'test':935,1123 'throw':1009 'time':545 'timeout':914 'token':55,81,93,123,146,167,738,743,996,1062 'tokenenrichmentfunct':110 'tokenenrichmentwithexternaldata':195 'tool':941 'topic-agent-skills' 'topic-agentic-skills' 'topic-ai-agent-skills' 'topic-ai-agents' 'topic-ai-coding' 'topic-ai-workflows' 'topic-antigravity' 'topic-antigravity-skills' 'topic-claude-code' 'topic-claude-code-skills' 'topic-codex-cli' 'topic-codex-skills' 'tostr':450,455,534 'toupperinvari':535 'track':950 'treat':1112 'tri':613,969 'trigger':18,735 'troubleshoot':906 'true':466,712,723 'trust':885 'twilio':672 'type':729,731 'ui':62,300 'uri':868 'url':1050 'usa':374 'use':99,101,103,105,180,182,184,186,188,190,313,315,317,319,411,413,415,417,555,557,559,561,695,903,917,937,1081,1097 'usedevelopmentstorag':722 'user':69,127,131,218,225,233,408,776,850,857 'user.read':876 'userid':128,215,222,242,270,278 'userprofil':239,289 'userprofile.department':258 'userprofile.employeeid':256 'userprofile.roles':261 'usersignupinfo':444 'v1.1.0':44 'v2':163 'valid':399,403,456,483,486,781,881,888,1122 'validate/modify':66 'valu':720,773,786,986 'var':138,238,243,271,280,346,434,441,579,697,973 'verif':624,654 'version':43,706 'via':547,616 'web':1033 'webjob':4 'webjobsattributecollectionstartrequest':332,752 'webjobsattributecollectionstartrespons':349,757 'webjobsattributecollectionsubmitrequest':430,762 'webjobsattributecollectionsubmitrespons':437,766 'webjobsauthenticationeventrespons':115,329,427,962 'webjobsauthenticationeventstrigg':117,209,331,429,574,964 'webjobsauthenticationeventstriggerattribut':733 'webjobscontinuewithdefaultbehavior':358,805 'webjobsmodifyattributevalu':523,783 'webjobsonotpsendfail':606,649,801 'webjobsonotpsendrequest':575,787 'webjobsonotpsendrespons':582,792 'webjobsonotpsendsuccess':630,797 'webjobsprovideclaimsfortoken':149,249,747,979 'webjobssetprefillvalu':365,770 'webjobsshowblockpag':386,469,774 'webjobsshowvalidationerror':495,779 'webjobstokenissuancestartrequest':118,210,737,965 'webjobstokenissuancestartrespons':141,231,246,742,976,1017 'without':1004 'worker':693,725 'workflow':79,1089 'would':1011 'www.nuget.org':1054 'www.nuget.org/packages/microsoft.azure.webjobs.extensions.authenticationevents':1053","prices":[{"id":"260dbeba-ad16-43a7-9034-fac88c6ebe11","listingId":"93c241ff-3699-41fd-92bd-e5cd0f98b423","amountUsd":"0","unit":"free","nativeCurrency":null,"nativeAmount":null,"chain":null,"payTo":null,"paymentMethod":"skill-free","isPrimary":true,"details":{"org":"sickn33","category":"antigravity-awesome-skills","install_from":"skills.sh"},"createdAt":"2026-04-18T21:40:45.598Z"}],"sources":[{"listingId":"93c241ff-3699-41fd-92bd-e5cd0f98b423","source":"github","sourceId":"sickn33/antigravity-awesome-skills/microsoft-azure-webjobs-extensions-authentication-events-dotnet","sourceUrl":"https://github.com/sickn33/antigravity-awesome-skills/tree/main/skills/microsoft-azure-webjobs-extensions-authentication-events-dotnet","isPrimary":false,"firstSeenAt":"2026-04-18T21:40:45.598Z","lastSeenAt":"2026-04-23T06:51:33.619Z"}],"details":{"listingId":"93c241ff-3699-41fd-92bd-e5cd0f98b423","quickStartSnippet":null,"exampleRequest":null,"exampleResponse":null,"schema":null,"openapiUrl":null,"agentsTxtUrl":null,"citations":[],"useCases":[],"bestFor":[],"notFor":[],"kindDetails":{"org":"sickn33","slug":"microsoft-azure-webjobs-extensions-authentication-events-dotnet","github":{"repo":"sickn33/antigravity-awesome-skills","stars":34666,"topics":["agent-skills","agentic-skills","ai-agent-skills","ai-agents","ai-coding","ai-workflows","antigravity","antigravity-skills","claude-code","claude-code-skills","codex-cli","codex-skills","cursor","cursor-skills","developer-tools","gemini-cli","gemini-skills","kiro","mcp","skill-library"],"license":"mit","html_url":"https://github.com/sickn33/antigravity-awesome-skills","pushed_at":"2026-04-23T06:41:03Z","description":"Installable GitHub library of 1,400+ agentic skills for Claude Code, Cursor, Codex CLI, Gemini CLI, Antigravity, and more. Includes installer CLI, bundles, workflows, and official/community skill collections.","skill_md_sha":"83ab6a1023a488a188682bf5ca249125ac3b8586","skill_md_path":"skills/microsoft-azure-webjobs-extensions-authentication-events-dotnet/SKILL.md","default_branch":"main","skill_tree_url":"https://github.com/sickn33/antigravity-awesome-skills/tree/main/skills/microsoft-azure-webjobs-extensions-authentication-events-dotnet"},"layout":"multi","source":"github","category":"antigravity-awesome-skills","frontmatter":{"name":"microsoft-azure-webjobs-extensions-authentication-events-dotnet","description":"Microsoft Entra Authentication Events SDK for .NET. Azure Functions triggers for custom authentication extensions."},"skills_sh_url":"https://skills.sh/sickn33/antigravity-awesome-skills/microsoft-azure-webjobs-extensions-authentication-events-dotnet"},"updatedAt":"2026-04-23T06:51:33.619Z"}}