{"version":"https://jsonfeed.org/version/1","title":"Posts on Coding Stephan","description":"Recent content in Posts on Coding Stephan","home_page_url":"/","feed_url":"/posts/index.json","author":{"name":"Stephan van Rooij"},"items":[{"title":"Microsoft Graph Dependency issues","date_published":"2026-10-06T12:05:56Z","date_modified":"2026-10-06T12:05:56Z","id":"/2026/10/06/microsoft-graph-dependency-issues/","url":"/2026/10/06/microsoft-graph-dependency-issues/","tags":["MSGraph PowerShell","Microsoft Graph"],"summary":"\u003cp\u003eThe \u003ca href=\"https://www.powershellgallery.com/packages/microsoft.graph.authentication/2.41.1\"\u003eMicrosoft Graph PowerShell module\u003c/a\u003e \u003cem\u003eused to\u003c/em\u003e have dependency conflicts with other (Microsoft) modules. You could not stably import them together with other modules. That sentence says \u003cem\u003eused to\u003c/em\u003e because I \u003ca href=\"#pull-request-3789\"\u003efixed\u003c/a\u003e them.\u003c/p\u003e\n\u003ch2 id=\"powershell-core\"\u003ePowerShell Core\u003c/h2\u003e\n\u003cp\u003eWith the \u0026ldquo;new\u0026rdquo; PowerShell version 6, Microsoft made PowerShell cross-platform. This was possible because they switched the runtime (the things that make it PowerShell) to use .NET Core, which was also cross-platform.\u003c/p\u003e\n\u003cp\u003eCheck-out the \u003ca href=\"https://learn.microsoft.com/en-us/lifecycle/products/powershell\"\u003ePowerShell lifecycle\u003c/a\u003e for supported versions. In the rest of this post I\u0026rsquo;ll just refer to it as PowerShell.\u003c/p\u003e"},{"title":"Hacking at Scottish Summit","date_published":"2026-10-03T13:05:00Z","date_modified":"2026-10-03T13:05:00Z","id":"/2026/10/03/hacking-scottish-summit/","url":"/2026/10/03/hacking-scottish-summit/","tags":["Hacking","Public Speaking","Security"],"summary":"\u003cp\u003eLast weekend (Oct 3rd 2026) I had the pleasure to speak at the \u003ca href=\"https://scottishsummit.com/\"\u003eScottish Summit\u003c/a\u003e with a brand new talk called \u003ca href=\"#think-like-a-hacker-in-5-steps\"\u003eThink like a hacker in 5 steps\u003c/a\u003e\u003c/p\u003e\n\u003ch2 id=\"think-like-a-hacker-in-5-steps\"\u003eThink like a hacker in 5 steps\u003c/h2\u003e\n\u003cp\u003eI wanted to warn people about some of the basics about hacking, so I wrote an abstract:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eEverybody knows that you should not plug in a random USB stick, right? With some simple tricks your users might be convinced otherwise. Hacks, data breaches, ransomware. Protecting your company can be hard if you don’t know what you’re looking for. Security starts with just that and what better way to figure out than by attempting to hack yourself or your co-workers.\u003c/p\u003e"},{"title":"Fido2 showdown: Security key form factors","date_published":"2026-09-28T10:00:00Z","date_modified":"2026-09-28T10:00:00Z","id":"/2026/09/28/fido2-showdown-form-factors/","url":"/2026/09/28/fido2-showdown-form-factors/","tags":["Fido2","Security","Passkeys"],"summary":"\u003cp\u003eIn \u003ca href=\"/2026/07/22/fido2-showdown-introduction/\"\u003emy introduction to this FIDO2 showdown\u003c/a\u003e, I explained why you might want a security key and how registration and authentication work. Now it is time to look at the different shapes these keys come in, because the shape has quite some impact on how you will use it every day.\u003c/p\u003e\n\u003cfigure\u003e\u003cimg src=\"/assets/images/2026/07/fido2-keys.jpg\"\u003e\u003cfigcaption\u003e\n\t\t\t\u003ch4\u003eA bunch of FIDO2 security keys\u003c/h4\u003e\n\t\t\u003c/figcaption\u003e\n\u003c/figure\u003e"},{"title":"Home Automation at .NET Zuid","date_published":"2026-09-08T19:44:52Z","date_modified":"2026-09-08T19:44:52Z","id":"/2026/09/08/home-automation-at-dotnet-zuid/","url":"/2026/09/08/home-automation-at-dotnet-zuid/","tags":["Public Speaking","Home Automation"],"summary":"\u003cp\u003eHome Automation is one of my hobbies, and today (September 8th) I had the pleasure to give a talk on this. Fortyfive minutes filled with home automation. Because of the many questions and the enthusiastic attendees that turned into an hour.\u003c/p\u003e"},{"title":"Smartify your doorbell","date_published":"2026-08-14T09:43:44Z","date_modified":"2026-08-14T09:43:44Z","id":"/2026/08/14/smartify-doorbell/","url":"/2026/08/14/smartify-doorbell/","tags":["Home Assistant","Home Automation"],"summary":"\u003cp\u003eI have a regular old fashion \u0026ldquo;ding-dong\u0026rdquo; doorbell, but what is the fun of that?\u003c/p\u003e\n\u003cfigure\u003e\u003ca href=\"/assets/images/2026/08/dumb-doorbell.jpg\"\u003e\u003cimg src=\"/assets/images/2026/08/dumb-doorbell.jpg\"\u003e\u003c/a\u003e\u003cfigcaption\u003e\n\t\t\t\u003ch4\u003eNot smart doorbell\u003c/h4\u003e\n\t\t\u003c/figcaption\u003e\n\u003c/figure\u003e"},{"title":"Extending Home Assistant: Custom Integration","date_published":"2026-08-11T12:43:33Z","date_modified":"2026-08-11T12:43:33Z","id":"/2026/08/11/extending-home-assistant-custom-integration/","url":"/2026/08/11/extending-home-assistant-custom-integration/","tags":["Home Assistant"],"summary":"\u003cp\u003eI recently built a custom integration \u003ca href=\"https://github.com/svrooij/homeassistant-microsoft-calendar\"\u003eMicrosoft Calendar\u003c/a\u003e for \u003ca href=\"https://www.home-assistant.io/\"\u003eHome Assistant\u003c/a\u003e. Which does just that, connect your Microsoft 365 calendar to Home Assistant. Allowing you to react to events from your calendar and to even modify events in your calendar. This post will describe how you can do the same with the support for debugging, which is essential for your development/testing flow.\u003c/p\u003e\n\u003cfigure\u003e\u003ca href=\"/assets/images/2026/08/home-assistant-add-event-m365-calendar.png\"\u003e\u003cimg src=\"/assets/images/2026/08/home-assistant-add-event-m365-calendar.png\"\u003e\u003c/a\u003e\u003cfigcaption\u003e\n\t\t\t\u003ch4\u003eHome assistant add event to M365 calendar\u003c/h4\u003e\n\t\t\u003c/figcaption\u003e\n\u003c/figure\u003e"},{"title":"Home Assistant: Adding PKCE support","date_published":"2026-08-11T12:01:38Z","date_modified":"2026-08-11T12:01:38Z","id":"/2026/08/11/home-assistant-adding-pkce-support/","url":"/2026/08/11/home-assistant-adding-pkce-support/","tags":["Home Assistant","Security"],"summary":"\u003cp\u003e\u003ca href=\"https://home-assistant.io\"\u003eHome Assistant\u003c/a\u003e is an open source, local focussed home automation platform, why would it need PKCE support? Not all devices have a local api, and for those products and services that only have a cloud api or are in fact cloud only we want the most secure way to connect.\u003c/p\u003e\n\u003cfigure\u003e\u003ca href=\"https://www.home-assistant.io/changelogs/core-2025.4/\"\u003e\u003cimg src=\"/assets/images/2026/08/home-assistant-pkce-support.png\"\u003e\u003c/a\u003e\u003cfigcaption\u003e\n\t\t\t\u003ch4\u003eHome Assistant 2025.4 release notes\u003c/h4\u003e\n\t\t\u003c/figcaption\u003e\n\u003c/figure\u003e"},{"title":"Home Assistant: does it Matter?","date_published":"2026-08-10T14:01:35Z","date_modified":"2026-08-10T14:01:35Z","id":"/2026/08/10/home-assistant-matter/","url":"/2026/08/10/home-assistant-matter/","tags":["Home Assistant","Matter"],"summary":"\u003cp\u003eI\u0026rsquo;m a long time user of \u003ca href=\"https://www.home-assistant.io/\"\u003eHome Assistant\u003c/a\u003e, it allows me to locally control most devices in my home. My home assistant installation method of choice is the \u003ca href=\"https://www.home-assistant.io/installation/alternative/#docker-compose\"\u003eHome assistant container\u003c/a\u003e running in docker. I like to manage things myself and didn\u0026rsquo;t want to utilize Home Assistant OS.\u003c/p\u003e\n\u003cp\u003eThis choice for the container over the full blown OS, is usually the best choice for me, but when it comes to Matter it really bit me, in this post I\u0026rsquo;ll explain how I got matter to work in home assistant container.\u003c/p\u003e"},{"title":"Fido2 showdown: An Introduction","date_published":"2026-07-22T09:52:41Z","date_modified":"2026-07-22T09:52:41Z","id":"/2026/07/22/fido2-showdown-introduction/","url":"/2026/07/22/fido2-showdown-introduction/","tags":["Fido2","Security","Passkeys"],"summary":"\u003cp\u003eFido2 security keys why would you want them, what kinds do you have and which one suits your need. This is what you\u0026rsquo;re going to find out the next couple of days.\u003c/p\u003e"},{"title":"Prevent Drivers From Installing Apps","date_published":"2026-07-21T12:33:18Z","date_modified":"2026-07-21T12:33:18Z","id":"/2026/07/21/prevent-drivers-installing-apps/","url":"/2026/07/21/prevent-drivers-installing-apps/","tags":["Security-shorts","Security"],"summary":"\u003cp\u003eLG monitor that install adware once plugged in to your machine, that does not sound good. Apparently Microsoft allows \u0026ldquo;trusted\u0026rdquo; driver providers to include apps in their driver metadata. Meaning if Windows detects such a device it will \u0026ldquo;auto\u0026rdquo; install the apps (by default).\u003c/p\u003e"},{"title":"Most Valuable Professional 2026","date_published":"2026-07-16T13:20:11Z","date_modified":"2026-07-16T13:20:11Z","id":"/2026/07/16/valuable-professional-2026/","url":"/2026/07/16/valuable-professional-2026/","tags":["MVP","Security",".NET"],"summary":"\u003cp\u003eWednesday July 15th 2026 I got an email from Microsoft, \u0026ldquo;You’ve been accepted to the Microsoft MVP Program!\u0026rdquo;. The Microsoft Most Valuable Professional award is given to people like me who contribute a lot to open-source, speak at conferences, write documentation or  help others use various Microsoft technologies.\u003c/p\u003e\n\u003cfigure\u003e\u003ca href=\"https://mvp.microsoft.com/en-US/MVP/profile/cc128f12-003f-ed11-bba3-000d3a197333\"\u003e\u003cimg src=\"/assets/images/2026/07/mvp-badge-2026-2027-stephan.png\"\u003e\u003c/a\u003e\u003cfigcaption\u003e\n\t\t\t\u003ch4\u003eMVP Badge\u003c/h4\u003e\n\t\t\u003c/figcaption\u003e\n\u003c/figure\u003e\n\n\u003cp\u003eCheck out my \u003ca href=\"https://mvp.microsoft.com/en-US/MVP/profile/cc128f12-003f-ed11-bba3-000d3a197333\"\u003eMVP profile\u003c/a\u003e\u003c/p\u003e"},{"title":"Blog Upgraded: New Features","date_published":"2026-07-15T11:10:12Z","date_modified":"2026-07-15T11:10:12Z","id":"/2026/07/15/blog-upgraded-search/","url":"/2026/07/15/blog-upgraded-search/","tags":["New Blog","lifehack"],"summary":"\u003cp\u003eI\u0026rsquo;ve been running this blog for a while, and the past year the search was broken. I had started fixing it and failed miserably. I finally took some time to redesign it and it is faster then ever.\u003c/p\u003e"},{"title":"Unlocking Workcation at Microsoft Security Meetup","date_published":"2026-06-16T19:53:04Z","date_modified":"2026-06-16T19:53:04Z","id":"/2026/06/16/unlocking-workcation-microsoft-security-meetup/","url":"/2026/06/16/unlocking-workcation-microsoft-security-meetup/","tags":["Public Speaking","Access Packages"],"summary":"\u003cp\u003eToday June 16th I had the pleasure to do an introduction to access packages at the \u003ca href=\"https://www.meetup.com/nl-nl/microsoft-security-nl/\"\u003eDutch Microsoft Security Meetup\u003c/a\u003e. I really like this security meetup. They start with dinner, then two talks and a closing pubquiz.\u003c/p\u003e\n\u003cfigure\u003e\u003cimg src=\"/assets/images/2026/06/workcation-unlocked-at-microsoft-security-nl.jpg\"\u003e\u003cfigcaption\u003e\n\t\t\t\u003ch4\u003eDutch Microsoft Security Meetup: Access packages UI\u003c/h4\u003e\n\t\t\u003c/figcaption\u003e\n\u003c/figure\u003e"},{"title":"Experts Live NL 2026: Workcation unlocked","date_published":"2026-06-02T18:44:52Z","date_modified":"2026-06-02T18:44:52Z","id":"/2026/06/02/experts-live-workcation-unlocked-access-packages/","url":"/2026/06/02/experts-live-workcation-unlocked-access-packages/","tags":["Public Speaking","Access Packages"],"summary":"\u003cp\u003eI want to do a session on access packages at \u003ca href=\"https://expertslive.nl\"\u003eExperts Live The Netherlands\u003c/a\u003e, will you join me \u003ca href=\"https://linkedin.com/in/fabianbader\"\u003eFabian\u003c/a\u003e?\nThis question was the start of our session on Access packages at Experts Live NL, with this idea in mind I had to think up a clever use-case that would spark interest with both the content team and the attendees.\u003c/p\u003e\n\u003cp\u003eWhat about enabling a \u003cstrong\u003eworkcation\u003c/strong\u003e?\u003c/p\u003e\n\u003cfigure\u003e\u003cimg src=\"/assets/images/2026/06/workcation-unlocked-access-packages.jpg\"\u003e\u003cfigcaption\u003e\n\t\t\t\u003ch4\u003eExperts Live: Workcation unlocked using Access Packages selfie\u003c/h4\u003e\n\t\t\u003c/figcaption\u003e\n\u003c/figure\u003e"},{"title":"Experts Live 2026: Masterclass Identity","date_published":"2026-06-01T19:02:51Z","date_modified":"2026-06-01T19:02:51Z","id":"/2026/06/01/experts-live-2026-masterclass-identity/","url":"/2026/06/01/experts-live-2026-masterclass-identity/","tags":["Public Speaking","Microsoft365"],"summary":"\u003cp\u003eThe biggest community driven event around the Microsoft ecosystem in The Netherlands is \u003ca href=\"https://expertslive.nl\"\u003eExperts Live\u003c/a\u003e. And in 2026 the organization had the idea to do one day of deep dive masterclasses before the regular conference day.\u003c/p\u003e\n\u003cp\u003eI was asked by \u003ca href=\"https://janbakker.tech\"\u003eJan Bakker\u003c/a\u003e to join the Identity masterclass. A full day on everything identity in Microsoft Entra.\u003c/p\u003e\n\u003cfigure\u003e\u003cimg src=\"/assets/images/2026/06/masterclass-identity-at-experts-live.png\"\u003e\u003cfigcaption\u003e\n\t\t\t\u003ch4\u003eExperts Live: Masterclass Identity\u003c/h4\u003e\n\t\t\u003c/figcaption\u003e\n\u003c/figure\u003e\n\n\u003ch2 id=\"listening-and-doing\"\u003eListening and doing\u003c/h2\u003e\n\u003cp\u003eAn entire day of consuming knowledge is not doable, so we decided to make different chunks. A short presentation followed by the attendees getting some hands on experience on that topic. This was received well according to the feedback.\u003c/p\u003e"},{"title":"Workplace Ninjas Oslo: Identity in Production Explained","date_published":"2026-05-27T14:26:30Z","date_modified":"2026-05-27T14:26:30Z","id":"/2026/05/27/workplace-ninjas-oslo-identity-production-explained/","url":"/2026/05/27/workplace-ninjas-oslo-identity-production-explained/","tags":["Public Speaking","Security","Managed Identity"],"summary":"\u003cp\u003eExplaining developers how to correctly implement identity in production, that is a topic that does not get enough attention. Most developers don\u0026rsquo;t really like to talk about security or identity. They see it as a nuisance, \u0026ldquo;I have to do this, but I don\u0026rsquo;t really like it\u0026rdquo;.\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"https://linkedin.com/in/luisefreese\"\u003eLuise\u003c/a\u003e and I feel different about this topic. We enjoy talking security in relation to developers. Which is why we submitted our talk \u003cem\u003eIdentity in prod: Live-debugging AADSTS errors \u0026amp; building secretless architectures that don\u0026rsquo;t break\u003c/em\u003e to \u003ca href=\"https://wpninjas.no/\"\u003eWorkplace Ninja\u0026rsquo;s Norway\u003c/a\u003e.\u003c/p\u003e"},{"title":"Organizing .NET Zuid meetup","date_published":"2026-04-26T15:01:15Z","date_modified":"2026-04-26T15:01:15Z","id":"/2026/04/26/organizing-net-zuid-meetup/","url":"/2026/04/26/organizing-net-zuid-meetup/","tags":["Community","Meetup",".NET"],"summary":"\u003cp\u003eOver the past years I\u0026rsquo;ve been a regular attendee at the \u003ca href=\"https://www.dotnetzuid.nl/\"\u003eDOTNET Zuid\u003c/a\u003e meetup, a community-driven event for .NET developers in the south of the Netherlands. In January 2026, I was asked to give a \u003ca href=\"/2026/01/23/introduction-identity-proxy-dotnet-zuid/\"\u003etalk\u003c/a\u003e at their meetup, and I really enjoyed it.\u003c/p\u003e\n\u003cfigure\u003e\u003ca href=\"/2026/01/23/introduction-identity-proxy-dotnet-zuid/\"\u003e\u003cimg src=\"/assets/images/2026/01/dotnet_zuid_identityproxy_2026-01-20.jfif\"\u003e\u003c/a\u003e\u003cfigcaption\u003e\n\t\t\t\u003ch4\u003eIntroducing identity proxy at .NET Zuid\u003c/h4\u003e\n\t\t\u003c/figcaption\u003e\n\u003c/figure\u003e\n\n\u003ch2 id=\"from-attendee-to-organizer\"\u003eFrom attendee to organizer\u003c/h2\u003e\n\u003cp\u003eOrganizing +/- 10 meetups a year is a lot of work, all done by three volunteers for the .NET Zuid foundation. They were looking for more help, and eventually asked if I wanted to join the team. I was happy to say yes, and I have been helping out setting up stuff during the meetups.\u003c/p\u003e"},{"title":"Tilburg Tech Tuesday - Fake tokens for integration testing","date_published":"2026-04-22T08:26:02Z","date_modified":"2026-04-22T08:26:02Z","id":"/2026/04/22/tilburg-tech-tuesday-fake-tokens-integration-testing/","url":"/2026/04/22/tilburg-tech-tuesday-fake-tokens-integration-testing/","tags":["Public Speaking","Security","API"],"summary":"\u003cp\u003eTuesday April 21st 2026 I had the pleasure to speak at \u003ca href=\"https://www.meetup.com/nl-nl/tilburg-tech-tuesdays/\"\u003eTilburg Tech Tuesday\u003c/a\u003e and event hosted by \u003ca href=\"https://www.freshheads.nl/\"\u003eFreshheads\u003c/a\u003e. As being a developer enthusiastic about security, I off course, had to do a talk on something security.\u003c/p\u003e\n\u003cp\u003eI felt very proud to see a \u0026ldquo;sold-out\u0026rdquo; event with almost everybody showing up. No seats were left unused.\u003c/p\u003e\n\u003cp\u003eCheck out the slides below 👇\u003c/p\u003e\n\u003cfigure\u003e\u003ca href=\"https://codingstephan-my.sharepoint.com/:b:/g/personal/stephan_svrooij_io/IQAf7i5wMungRJWXyUCcBR7CAeupRzp1CCxhNJ-pbvc-Fto?e=FmUi77\"\u003e\u003cimg src=\"/assets/images/2026/04/API_authentication_testing_TTT.png\"\u003e\u003c/a\u003e\u003cfigcaption\u003e\n\t\t\t\u003ch4\u003eTilburg Tech Tuesday slides\u003c/h4\u003e\n\t\t\u003c/figcaption\u003e\n\u003c/figure\u003e"},{"title":"Build a rail menu in WinUI","date_published":"2026-04-07T10:28:12Z","date_modified":"2026-04-07T10:28:12Z","id":"/2026/04/07/build-rail-menu-winui/","url":"/2026/04/07/build-rail-menu-winui/","tags":[],"summary":"\u003cp\u003eI wanted to build my next app in WinUI, and I wanted to have a rail menu, with big clickable icons that would navigate to a different page. \u003ca href=\"https://apps.microsoft.com/detail/9n9pn1mm3bd5?hl=en-US\u0026amp;gl=US\"\u003eAI Dev Gallery\u003c/a\u003e has a great example of this, and fortunately it is all \u003ca href=\"https://github.com/microsoft/AI-Dev-Gallery\"\u003eopen-source\u003c/a\u003e. In this post I will show you how you can replicate this in your own WinUI app.\u003c/p\u003e\n\u003cfigure\u003e\u003ca href=\"/assets/images/2026/04/ai-dev-gallery-menu.png\"\u003e\u003cimg src=\"/assets/images/2026/04/ai-dev-gallery-menu.png\"\u003e\u003c/a\u003e\u003cfigcaption\u003e\n\t\t\t\u003ch4\u003eAI Dev Gallery Menu\u003c/h4\u003e\n\t\t\u003c/figcaption\u003e\n\u003c/figure\u003e"},{"title":"MVP Summit 2026: Key Insights and Highlights","date_published":"2026-03-29T14:04:08Z","date_modified":"2026-03-29T14:04:08Z","id":"/2026/03/29/mvp-summit-2026-key-insights-highlights/","url":"/2026/03/29/mvp-summit-2026-key-insights-highlights/","tags":[],"summary":"\u003cp\u003eThe \u003ca href=\"https://summit.microsoft.com/\"\u003eMVP Summit\u003c/a\u003e is an annual event where Microsoft MVPs from around the world gather to talk to Microsoft product teams. Learn about what is coming and mainly connecting with other MVPs. In 2026 my company \u003ca href=\"https://roostersync.nl\"\u003eRoostersync\u003c/a\u003e made it possible for me to attend the summit for the third time.\u003c/p\u003e\n\u003cp\u003eCheck out my \u003ca href=\"/2024/03/24/mvp-summit-2024/\"\u003eMVP Summit 2024\u003c/a\u003e post for a recap of that edition.\u003c/p\u003e\n\u003ch2 id=\"meeting-people\"\u003eMeeting people\u003c/h2\u003e\n\u003cp\u003eFor me the summit is all about meeting other MVPs and connecting with them. This year the pleasure started in the plane to Redmond, where I had the pleasure to sit next to a Partner Director Product Management in the Identity Team at Microsoft. We had a great conversation about identity stuff and the trip did not even start.\u003c/p\u003e"},{"title":"Automatic efficient API Client Generation with Kiota","date_published":"2026-03-16T13:41:21Z","date_modified":"2026-03-16T13:41:21Z","id":"/2026/03/16/automatic-efficient-api-client-generation-kiota/","url":"/2026/03/16/automatic-efficient-api-client-generation-kiota/","tags":[],"summary":"\u003cp\u003eI don\u0026rsquo;t like repeating myself. I also don\u0026rsquo;t like writing boilerplate code. Whenever I have to interact with an API, I hope that there is an openapi specification available, or even better a client library. Microsoft has built an open source project called \u003ca href=\"https://github.com/microsoft/kiota\"\u003eKiota\u003c/a\u003e that can generate client libraries for APIs based on their OpenAPI specifications.\u003c/p\u003e\n\u003cp\u003eYou have to run a command line tool to generate your client library, but I also like to see that automated as part of my regular development lifecycle.\u003c/p\u003e"},{"title":"Visit FutureTech as community partner","date_published":"2026-03-11T19:07:00Z","date_modified":"2026-03-11T19:07:00Z","id":"/2026/03/11/visit-futuretech-community-partner/","url":"/2026/03/11/visit-futuretech-community-partner/","tags":[".NET","Community"],"summary":"\u003cp\u003eOn March 11th 2026 I had the pleasure to visit \u003ca href=\"https://futuretech.nl/\"\u003eFutureTech\u003c/a\u003e as a community partner. FutureTech is a technology focused conference mainly focused on .NET and Azure. As being a new member of the organizing team of \u003ca href=\"https://www.dotnetzuid.nl/\"\u003eDOTNET Zuid\u003c/a\u003e I was invited to visit the conference and just have a good time talking to all those amazing people.\u003c/p\u003e\n\u003cfigure\u003e\u003ca href=\"https://futuretech.nl/\"\u003e\u003cimg src=\"/assets/images/2026/03/futuretech-welcome.jpeg\"\u003e\u003c/a\u003e\u003cfigcaption\u003e\n\t\t\t\u003ch4\u003eWelcome at FutureTech\u003c/h4\u003e\n\t\t\u003c/figcaption\u003e\n\u003c/figure\u003e\n\n\u003ch2 id=\"sessions\"\u003eSessions\u003c/h2\u003e\n\u003cp\u003eI had the pleasure to attend a lot of sessions, these are the ones that stood out for me:\u003c/p\u003e"},{"title":"Experts Live Denmark 2026","date_published":"2026-02-25T15:43:28Z","date_modified":"2026-02-25T15:43:28Z","id":"/2026/02/25/experts-live-denmark-2026/","url":"/2026/02/25/experts-live-denmark-2026/","tags":["Conference","Security","Public Speaking"],"summary":"\u003cp\u003eAs a frequent speaker at Experts live Netherlands, I also submitted a talk for the Danish edition of Experts Live, which took place in Copenhagen on February 25th, 2026. I was very happy to be accepted to speak at this event, which is one of the biggest Microsoft conferences in Denmark.\u003c/p\u003e\n\u003cfigure\u003e\u003ca href=\"/assets/images/2026/02/eldk-welcome.jpg\"\u003e\u003cimg src=\"/assets/images/2026/02/eldk-welcome.jpg\"\u003e\u003c/a\u003e\u003cfigcaption\u003e\n\t\t\t\u003ch4\u003eWelcome to Experts Live Denmark 2026\u003c/h4\u003e\n\t\t\u003c/figcaption\u003e\n\u003c/figure\u003e\n\n\u003ch2 id=\"forged-but-valid-how-to-test-api-authentication-and-why-you-should-care\"\u003eForged but valid: How to test API authentication and why you should care\u003c/h2\u003e\n\u003cp\u003eWednesday 10:00 to 11:00 in the \u003cstrong\u003eDevelopment\u003c/strong\u003e track. An hour long session about testing API authentication and why it is important to do so. Here is the abstract:\u003c/p\u003e"},{"title":"Exploring Cloud Tech Tallinn: Day 2 Maester","date_published":"2026-01-30T19:09:00Z","date_modified":"2026-01-30T19:09:00Z","id":"/2026/01/30/exploring-cloud-tech-tallinn-day-2-maester/","url":"/2026/01/30/exploring-cloud-tech-tallinn-day-2-maester/","tags":["Conference","Public Speaking","Security"],"summary":"\u003cp\u003eOn January 30th 2026, \u003ca href=\"https://cloudtechtallinn.com/\"\u003eCloud Tech Tallinn\u003c/a\u003e had its second conference day, and I had my second talk of the conference.\u003c/p\u003e\n\u003ch2 id=\"become-a-maester-in-microsoft-365-security\"\u003eBecome a Maester in Microsoft 365 security\u003c/h2\u003e\n\u003cp\u003eBack in 2025 I had the idea to give a \u003ca href=\"/2025/06/10/maester-expertslive-nl-2025/\"\u003etalk about Maester\u003c/a\u003e as Experts Live Netherlands together with my friend and fellow MVP \u003ca href=\"https://www.linkedin.com/in/fabianbader/\"\u003eFabian Bader\u003c/a\u003e. The first time we gave this talk we had some feedback on how we could improve it, and I wanted to give this talk again with Fabian in the improved version. When I saw the call for speakers for Cloud Tech Tallinn I thought this would be a great opportunity to give this talk again, and I was thrilled when I got accepted to speak at this amazing conference.\u003c/p\u003e"},{"title":"Exploring Cloud Tech Tallinn: Day 1 Hack your protected API","date_published":"2026-01-29T19:09:00Z","date_modified":"2026-01-29T19:09:00Z","id":"/2026/01/29/exploring-cloud-tech-tallinn-day-1-hack-protected-api/","url":"/2026/01/29/exploring-cloud-tech-tallinn-day-1-hack-protected-api/","tags":[".NET","Conference","Public Speaking","Security"],"summary":"\u003cp\u003eOn January 29th 2026, I had the pleasure of attending my first edition of \u003ca href=\"https://cloudtechtallinn.com/\"\u003eCloud Tech Tallinn\u003c/a\u003e and speaking at this amazing event. The conference was held at the Tallinn Creative Hub in Estonia. The venue was fantastic, with a great atmosphere and plenty of space for networking and learning. The conference featured a wide range of sessions on cloud technologies, development and security, and I was excited to be a part of it.\u003c/p\u003e"},{"title":"Introduction to Identity Proxy at DOTNET Zuid","date_published":"2026-01-23T10:28:29Z","date_modified":"2026-01-23T10:28:29Z","id":"/2026/01/23/introduction-identity-proxy-dotnet-zuid/","url":"/2026/01/23/introduction-identity-proxy-dotnet-zuid/","tags":[".NET Core","API","jwt","Public Speaking"],"summary":"\u003cp\u003eAfter visiting \u003ca href=\"https://www.dotnetzuid.nl/\"\u003eDOTNET Zuid\u003c/a\u003e meetups several times past year, I decided that it was time to propose a talk myself. Over the past years, I\u0026rsquo;ve been building an \u003ca href=\"/2025/11/19/introducing-identity-proxy/\"\u003eIdentity Proxy\u003c/a\u003e. This is a topic I am passionate about, and I know most developers struggle with authentication and authorization in their applications. So I thought it would be a great idea to share my knowledge and experience with the community.\u003c/p\u003e"},{"title":"Remove merged branches with PowerShell","date_published":"2026-01-08T11:53:16Z","date_modified":"2026-01-08T11:53:16Z","id":"/2026/01/08/remove-merged-branches-powershell/","url":"/2026/01/08/remove-merged-branches-powershell/","tags":["Best Practices","Git","GitHub","PowerShell"],"summary":"\u003cp\u003eWhen working with Git repositories, it\u0026rsquo;s common to have multiple branches that have already been merged into the main branch. To keep your repository clean and organized, you can use PowerShell to remove these merged branches easily.\u003c/p\u003e\n\u003ch2 id=\"powershell-solution\"\u003ePowerShell Solution\u003c/h2\u003e\n\u003cp\u003eAs a developer running Windows all search engine results pointed me to bash scripts or Linux commands. However, I wanted a solution that works natively in PowerShell. Here\u0026rsquo;s a simple script that accomplishes this:\u003c/p\u003e"},{"title":"OpenAPI in Dotnet 10: Number quirk","date_published":"2025-12-19T13:13:15Z","date_modified":"2025-12-19T13:13:15Z","id":"/2025/12/19/openapi-dotnet-10-number-quirk/","url":"/2025/12/19/openapi-dotnet-10-number-quirk/","tags":[".NET Core","dotnet","dotnet-10","jsonschema","openapi","schema-transformer","swagger","API"],"summary":"\u003cp\u003eDid you already upgrade your API to Dotnet 10, and are you using OpenAPI specs? Then you might want to read on the next information. We use the \u003ccode\u003eMicrosoft.AspNetCore.OpenApi\u003c/code\u003e package to generate openapi specifications for our api, which is in turn used to generate client code for various platforms.\u003c/p\u003e\n\u003cp\u003eI\u0026rsquo;m not sure when this started, but it seems numbers are now specified to be either a number or a string with a regex pattern. This causes issues in the generated code and we need it gone.\u003c/p\u003e\n\u003cp\u003eCheck out the \u003ca href=\"#update\"\u003eupdate\u003c/a\u003e below if you want to skip the context and go straight to the solution.\u003c/p\u003e"},{"title":"Do all your endpoints require authentication?","date_published":"2025-11-24T09:49:16Z","date_modified":"2025-11-24T09:49:16Z","id":"/2025/11/24/endpoints-require-autentication/","url":"/2025/11/24/endpoints-require-autentication/","tags":[],"summary":"\u003cp\u003eYou built an API, where every endpoint requires the user to be authenticated. If you\u0026rsquo;re working with dotnet core minimal apis you can add the need for authentication by adding \u003ccode\u003e.RequireAuthentication()\u003c/code\u003e to that specific endpoint.\u003c/p\u003e\n\u003cp\u003eBelow I\u0026rsquo;ll show you how you can test all endpoints for authentication with just a few lines of test code.\u003c/p\u003e"},{"title":"Introducing Identity Proxy","date_published":"2025-11-19T12:37:14Z","date_modified":"2025-11-19T12:37:14Z","id":"/2025/11/19/introducing-identity-proxy/","url":"/2025/11/19/introducing-identity-proxy/","tags":[".NET","API","Authentication","JWT","Open Source"],"summary":"\u003cp\u003eWe built a lot of public and private APIs, they all have one thing in common, authentication works with \u003ca href=\"/2019/03/25/jwt-introduction/\"\u003eJSON Web Tokens\u003c/a\u003e. Meaning there is an identity provider (IDP) that can create tokens and our API just accepts any token signed by that IDP. We also think it is a good idea to tests all your APIs, in that the new version does not break anything and works as intended.\u003c/p\u003e"},{"title":"CollabDays Belgium 2025","date_published":"2025-10-20T08:09:35Z","date_modified":"2025-10-20T08:09:35Z","id":"/2025/10/20/collabdays-belgium-2025/","url":"/2025/10/20/collabdays-belgium-2025/","tags":[],"summary":"\u003cp\u003e\u003ca href=\"https://www.collabdays.org/2025-belgium/\"\u003eCollabDays Belgium 2025\u003c/a\u003e took place on October 18th 2025 in Edegem, Belgium. This year I had the pleasure to give not one, but two sessions! What a day it was. A lot of positive energy, learnings and networking. Check out the key takeaways from this great event below.\u003c/p\u003e"},{"title":"Publish to nuget without a token","date_published":"2025-10-16T14:22:36Z","date_modified":"2025-10-16T14:22:36Z","id":"/2025/10/16/publish-nuget-token/","url":"/2025/10/16/publish-nuget-token/","tags":["Github Actions","Federated Credentials"],"summary":"\u003cp\u003eEver got a message from nuget.org stating that your API key is expiring or has expired? Well, I sure did. Most of the 20 packages I maintain are published using GitHub Actions. I created separate API keys for each package, and stored them in the respective github repository secrets. So I have 20 keys to manage and rotate every year.\u003c/p\u003e\n\u003cp\u003eFast-forward to September 2025, when NuGet announced support for \u003ca href=\"https://learn.microsoft.com/en-us/nuget/nuget-org/trusted-publishing?wt.mc_id=SEC-MVP-5004985\"\u003eTrusted Publishing\u003c/a\u003e from GitHub. And today I show you how to convert your existing GitHub Actions workflow to use trusted publishing instead of an API key.\u003c/p\u003e"},{"title":"Secretless confidential applications","date_published":"2025-10-10T12:26:07Z","date_modified":"2025-10-10T12:26:07Z","id":"/2025/10/10/secretless-confidential-applications/","url":"/2025/10/10/secretless-confidential-applications/","tags":["Federated Credentials","Managed Identity"],"summary":"\u003cp\u003eThe Microsoft Authentication Library (MSAL) is one of my favorite libraries. It eases the process of getting tokens for Entra ID protected resources, and since most developers seem to struggle with getting tokens that is great. What is not so great, is the (out-of-the-box) lack of support for managed identities in confidential client applications. And I\u0026rsquo;m all-in for trying to get rid of secrets in applications, so I wanted to help all other developers.\u003c/p\u003e"},{"title":"Cloud Identity Summit 2025","date_published":"2025-09-04T17:43:00Z","date_modified":"2025-09-04T17:43:00Z","id":"/2025/09/04/cloud-identity-summit/","url":"/2025/09/04/cloud-identity-summit/","tags":["Conference","Security","Public Speaking"],"summary":"\u003cp\u003eI heard about the Cloud Identity Summit, so I submitted a talk about testing API authentication. To my surprise I was accepted to speak at this conference. On a for me well known topic, but I was able to share my hacking skills with the audience.\u003c/p\u003e\n\u003cfigure\u003e\u003ca href=\"/assets/images/2025/09/cis_session_selfie.jpg\"\u003e\u003cimg src=\"/assets/images/2025/09/cis_session_selfie.jpg\"\u003e\u003c/a\u003e\u003cfigcaption\u003e\n\t\t\t\u003ch4\u003eWelcome to Cloud Identity Summit 2025\u003c/h4\u003e\n\t\t\u003c/figcaption\u003e\n\u003c/figure\u003e\n\n\u003ch2 id=\"hack-your-protected-api-for-integration-testing\"\u003eHack your protected API for integration testing\u003c/h2\u003e\n\u003cp\u003eThursday 11:00 to 11:50 in the \u003cstrong\u003eIdentity Security\u003c/strong\u003e track. An hour long session about testing API authentication and why it is important to do so. Here is the abstract:\u003c/p\u003e"},{"title":"Let's talk App Roles","date_published":"2025-08-27T08:22:53Z","date_modified":"2025-08-27T08:22:53Z","id":"/2025/08/27/entra-approles/","url":"/2025/08/27/entra-approles/","tags":["Entra ID","Externalize Users"],"summary":"\u003cp\u003eWhat are App roles in Microsoft Entra ID and why you should definitely be using them. Let\u0026rsquo;s talk app roles today.\u003c/p\u003e\n\u003cfigure\u003e\u003ca href=\"/assets/images/2025/08/app-roles.png\"\u003e\u003cimg src=\"/assets/images/2025/08/app-roles.png\"\u003e\u003c/a\u003e\u003cfigcaption\u003e\n\t\t\t\u003ch4\u003eManage app roles in Entra ID\u003c/h4\u003e\n\t\t\u003c/figcaption\u003e\n\u003c/figure\u003e"},{"title":"Vibe smarter not harder","date_published":"2025-08-19T12:45:03Z","date_modified":"2025-08-19T12:45:03Z","id":"/2025/08/19/vibe-smarter-harder/","url":"/2025/08/19/vibe-smarter-harder/","tags":["Vibe Coding"],"summary":"\u003cp\u003e\u003ca href=\"https://github.com/svrooij/unobtanium-web-proxy\"\u003eUnobtanium.Web.Proxy\u003c/a\u003e is my new pet project. It is a http(s) inspection proxy that allows developers to add a web proxy to their own project. This is used in \u003ca href=\"https://learn.microsoft.com/en-us/microsoft-cloud/dev/dev-proxy/overview?wt.mc_id=SEC-MVP-5004985\"\u003eMicrosoft DevProxy\u003c/a\u003e. In the next \u003ca href=\"https://github.com/svrooij/unobtanium-web-proxy/releases/tag/v0.9.1-beta.2\"\u003erelease\u003c/a\u003e the complete API of Unobtanium.Web.Proxy will be changed. Using just \u0026ldquo;native\u0026rdquo; dotnet objects to interact with Http requests.\u003c/p\u003e\n\u003cp\u003eI\u0026rsquo;ll show you how to use Github Copilot in your next breaking change migration project.\u003c/p\u003e\n\u003c!-- more --\u003e\n\u003ch2 id=\"breaking-changes-\"\u003eBreaking Changes 💣\u003c/h2\u003e\n\u003cp\u003eThis \u003ca href=\"https://github.com/svrooij/m365-developer-proxy/commit/0633c3b920b95e982033391a56a91a3ce749ac15#diff-ce63f1fd864e22580c61c045af8e5e39ffffbd7bbe4e398514d55f2ea9594ad7\"\u003ecommit\u003c/a\u003e will show you exactly what changed, but I\u0026rsquo;ll summarize:\u003c/p\u003e"},{"title":"Deploy to Azure Static Web App the slim way","date_published":"2025-06-26T13:41:32Z","date_modified":"2025-06-26T13:41:32Z","id":"/2025/06/26/deploy-azure-static-web-app-slim/","url":"/2025/06/26/deploy-azure-static-web-app-slim/","tags":["Github Actions","Azure Static Web App"],"summary":"\u003cp\u003eHave you ever used Azure Static Web Apps, and used the portal wizard to set it up? Then you\u0026rsquo;re probably using the \u003ca href=\"https://github.com/marketplace/actions/azure-static-web-apps-deploy\"\u003eAzure Static Web App deploy Github Actions\u003c/a\u003e. Which is a humongous Github Action (1.6 GB docker container), that is also capable of automatically discovering how to build any of the supported apps.\u003c/p\u003e\n\u003cp\u003eWhat if you don\u0026rsquo;t need any of the auto build capabilities? Microsoft does not officially support any other way to deploy to Azure Static Web Apps, so you\u0026rsquo;re out of luck. They might be some other way, read on if you want to know more.\u003c/p\u003e"},{"title":"Maester at ExpertsLive NL 2025","date_published":"2025-06-10T10:07:36Z","date_modified":"2025-06-10T10:07:36Z","id":"/2025/06/10/maester-expertslive-nl-2025/","url":"/2025/06/10/maester-expertslive-nl-2025/","tags":["Security","Maester"],"summary":"\u003cp\u003eWhat is \u003ca href=\"https://maester.dev\"\u003eMaester\u003c/a\u003e and why did I want to give a talk about it at \u003ca href=\"https://expertslive.nl\"\u003eExperts live Netherlands\u003c/a\u003e? Did I spark your interest? Read on and I\u0026rsquo;ll explain all about it.\u003c/p\u003e\n\u003cfigure\u003e\u003ca href=\"#\"\u003e\u003cimg src=\"/assets/images/2025/06/el2025-maester-slide1.png\"\u003e\u003c/a\u003e\u003cfigcaption\u003e\n\t\t\t\u003ch4\u003eJune 3rd - Experts Live Netherlands 2025\u003c/h4\u003e\n\t\t\u003c/figcaption\u003e\n\u003c/figure\u003e\n\n\u003c!-- more --\u003e\n\u003ch2 id=\"what-is-maester\"\u003eWhat is Maester?\u003c/h2\u003e\n\u003cp\u003e\u003ca href=\"https://maester.dev\"\u003eMaester\u003c/a\u003e is an \u003ca href=\"https://github.com/maester365/maester\"\u003eopen-source\u003c/a\u003e security scanner for your Microsoft 365 tenant, made by community members. Several people had this idea that it would be cool to be able to automatically scan your tenants configuration. And if you can do it automatically you can also schedule it.\u003c/p\u003e"},{"title":"Intune requirement for ARM64 devices","date_published":"2025-05-30T09:26:31Z","date_modified":"2025-05-30T09:26:31Z","id":"/2025/05/30/intune-requirement-arm64-devices/","url":"/2025/05/30/intune-requirement-arm64-devices/","tags":["Intune"],"summary":"\u003cp\u003eSince Microsoft is support Windows 11 on ARM64 devices, we see more and more devices running arm. While Microsoft made sure that it will emulate support for x64 applications. Running native ARM64 applications is way more power efficient and faster. If you manage your environment with Microsoft Intune, you might want to push ARM64 applications to your devices as well.\u003c/p\u003e\n\u003cfigure\u003e\u003ca href=\"/assets/images/2025/05/intune-requirements-not-met.png\"\u003e\u003cimg src=\"/assets/images/2025/05/intune-requirements-not-met.png\"\u003e\u003c/a\u003e\u003cfigcaption\u003e\n\t\t\t\u003ch4\u003eIntune requirements not met\u003c/h4\u003e\n\t\t\u003c/figcaption\u003e\n\u003c/figure\u003e"},{"title":"GitHub workflow commands in PowerShell","date_published":"2025-05-14T08:05:55Z","date_modified":"2025-05-14T08:05:55Z","id":"/2025/05/14/github-workflow-commands-powershell/","url":"/2025/05/14/github-workflow-commands-powershell/","tags":["Github Actions","PowerShell"],"summary":"\u003cp\u003eAs an author of GitHub Actions, you have the ability to use \u003ca href=\"https://docs.github.com/en/actions/writing-workflows/choosing-what-your-workflow-does/workflow-commands-for-github-actions\"\u003eworkflow commands\u003c/a\u003e to control specific things that happen when your workflow is executed. All the samples are in bash, but what if you did everything else in PowerShell? Can you do the same in PowerShell? Read along to find out how to do that.\u003c/p\u003e"},{"title":"Configure JWT Authentication in Dotnet","date_published":"2025-04-17T08:44:30Z","date_modified":"2025-04-17T08:44:30Z","id":"/2025/04/17/configure-jwt-authentication-dotnet/","url":"/2025/04/17/configure-jwt-authentication-dotnet/","tags":[".NET Core","Authentication","Entra ID","API"],"summary":"\u003cp\u003eWhen you develop an API you probably want an easy way to authenticate users. In this post, I will show you how to configure JWT authentication in a .NET API. This is a simple and effective way to secure your API endpoints. What is JWT? And how do you configure it the right way?\u003c/p\u003e"},{"title":"Write to Github Actions summary from DOTNET","date_published":"2025-04-14T09:00:00Z","date_modified":"2025-04-14T09:00:00Z","id":"/2025/04/14/github-summary-from-dotnet/","url":"/2025/04/14/github-summary-from-dotnet/","tags":[".NET","Github Actions"],"summary":"\u003cp\u003eGithub action runs can have these nice generated summaries, like the one for my \u003ca href=\"https://github.com/svrooij/winget-pkgs-index/actions/runs/14442520225\"\u003ewinget package index\u003c/a\u003e. But how do you set them? And can you do that with C#? Read on to see how you can do that as well.\u003c/p\u003e\n\u003cfigure\u003e\u003ca href=\"https://github.com/svrooij/winget-pkgs-index/actions/runs/14441201769\"\u003e\u003cimg src=\"/assets/images/2025/04/winget-index-job-summary.png\"\u003e\u003c/a\u003e\u003cfigcaption\u003e\n\t\t\t\u003ch4\u003eWinget index job summary\u003c/h4\u003e\n\t\t\u003c/figcaption\u003e\n\u003c/figure\u003e\n\n\u003ch2 id=\"github-action-summaries\"\u003eGithub Action summaries\u003c/h2\u003e\n\u003cp\u003eBack in 2022 Github \u003ca href=\"https://github.blog/news-insights/product-news/supercharging-github-actions-with-job-summaries/\"\u003ereleased\u003c/a\u003e Github Actions job summaries. Which is a nice feature that allows you to not only write stuff to the console, but also to write stuff to the \u003ca href=\"https://github.com/svrooij/winget-pkgs-index/actions/runs/14442520225\"\u003ebuild summary\u003c/a\u003e.\u003c/p\u003e"},{"title":"Bitbash 2025: A Deep Dive into Managed Identity","date_published":"2025-02-07T10:40:46Z","date_modified":"2025-02-07T10:40:46Z","id":"/2025/02/07/bitbash-2025-deep-dive-managed-identity/","url":"/2025/02/07/bitbash-2025-deep-dive-managed-identity/","tags":["Managed Identity","Entra ID"],"summary":"\u003cp\u003e\u003ca href=\"https://www.bitbash.nl/\"\u003eBitbash 2025\u003c/a\u003e was an \u003ca href=\"/2025/01/27/bitbash-2025/\"\u003eawesome\u003c/a\u003e conference, where I did a talk on managed identities. Here are the cliffnotes for that talk, and why I even do public speaking.\u003c/p\u003e\n\u003cfigure\u003e\u003ca href=\"/assets/images/2025/01/bitbash-ghostbusters.jpeg\"\u003e\u003cimg src=\"/assets/images/2025/01/bitbash-ghostbusters.jpeg\"\u003e\u003c/a\u003e\u003cfigcaption\u003e\n\t\t\t\u003ch4\u003eBitbash 2025\u003c/h4\u003e\n\t\t\u003c/figcaption\u003e\n\u003c/figure\u003e"},{"title":"Bitbash 2025: Two days packed with dotnet and cloud","date_published":"2025-01-27T13:29:00Z","date_modified":"2025-01-27T13:29:00Z","id":"/2025/01/27/bitbash-2025/","url":"/2025/01/27/bitbash-2025/","tags":[],"summary":"\u003cp\u003eJanuary 24th and 25th, 2025, \u003ca href=\"https://bitbash.nl\"\u003eBitbash\u003c/a\u003e was held in the Netherlands at Info Support HQ in Veenendaal. One day of workshops followed by one day packed with sessions. This was my second time attending and I enjoyed it a lot. What did I learn and what is now on my list of things I have to check into? They will probably organize it again next year and I will definitely be there.\u003c/p\u003e\n\u003cfigure\u003e\u003ca href=\"https://bitbash.nl/\"\u003e\u003cimg src=\"/assets/images/2025/01/bitbash-website.png\"\u003e\u003c/a\u003e\u003cfigcaption\u003e\n\t\t\t\u003ch4\u003eBitbash 2025\u003c/h4\u003e\n\t\t\u003c/figcaption\u003e\n\u003c/figure\u003e"},{"title":"Use multi tenant managed identity in Azure Automation","date_published":"2024-12-29T13:29:13Z","date_modified":"2024-12-29T13:29:13Z","id":"/2024/12/29/multi-tenant-managed-identity-azure-automation/","url":"/2024/12/29/multi-tenant-managed-identity-azure-automation/","tags":["Entra ID","Federated Credentials","Managed Identity"],"summary":"\u003cp\u003eWith the introduction of multi tenant support for \u003ca href=\"/2024/12/24/multi-tenant-managed-identity-finally/\"\u003emanaged identities\u003c/a\u003e it is time to take a look at how to use them in Azure Automation. This post will take you through all the steps needed to get this working.\u003c/p\u003e"},{"title":"Multi tenant managed identity is finally here","date_published":"2024-12-24T09:57:10Z","date_modified":"2024-12-24T09:57:10Z","id":"/2024/12/24/multi-tenant-managed-identity-finally/","url":"/2024/12/24/multi-tenant-managed-identity-finally/","tags":["Azure AD","Entra ID","Federated Credentials"],"summary":"\u003cp\u003eMicrosoft just announced that you can now \u0026ldquo;officially\u0026rdquo; use managed identities in a multi-tenant scenario. This is a huge step forward security wise, if you\u0026rsquo;re in the business of building multi-tenant applications. Let me explain what this is, how it works and why it\u0026rsquo;s important.\u003c/p\u003e"},{"title":"Comparing Azure AD B2C to Entra External ID","date_published":"2024-12-04T09:52:34Z","date_modified":"2024-12-04T09:52:34Z","id":"/2024/12/04/comparing-azure-ad-b2c-entra-external-id/","url":"/2024/12/04/comparing-azure-ad-b2c-entra-external-id/","tags":["Azure AD B2C","Entra External ID"],"summary":"\u003cp\u003eBuilding an application that requires user authentication? We all used to build this directly in our api / web application, but with all the security requirements and continuing hacking attempts, I would recommend against doing this part yourself. You cannot possibly spent as much money on security as the big companies do. So why not leverage their knowledge and experience?\u003c/p\u003e\n\u003cfigure\u003e\u003cimg src=\"/assets/images/2024/12/b2c-vs-external-id.jpeg\"\u003e\u003cfigcaption\u003e\n\t\t\t\u003ch4\u003eAzure AD B2C vs Entra External ID\u003c/h4\u003e\n\t\t\u003c/figcaption\u003e\n\u003c/figure\u003e\n\n\u003cp\u003eMicrosoft is one of those companies that can help you with user authentication for your application. They used to offer \u003cstrong\u003eAzure AD B2C\u003c/strong\u003e (Business to Consumer) for this, since a year or so they also offer \u003cstrong\u003eEntra External ID\u003c/strong\u003e. Both are identity solutions, but what are the differences between the two? And which one should you choose for your application? I\u0026rsquo;ll start with a comparison table and then try to explain those differences in more detail. Microsoft is not the only company that offers identity solutions, but they are the only one I have experience with. If you have experience with other solutions, please let me know in the comments.\u003c/p\u003e"},{"title":"Open-source explained for none developers","date_published":"2024-09-18T15:24:23Z","date_modified":"2024-09-18T15:24:23Z","id":"/2024/09/18/open-source-explained-developers/","url":"/2024/09/18/open-source-explained-developers/","tags":[],"summary":"\u003cp\u003eI recently saw a tweet from a well respected open-source developer, that someone was trying to use him as a free helpdesk. This is a common problem in the open-source community, and it\u0026rsquo;s a problem that I think is worth addressing. This explanation is not set in stone, but it\u0026rsquo;s a good starting point for understanding open-source.\u003c/p\u003e\n\u003cfigure\u003e\u003cimg src=\"/assets/images/2024/09/oss-helpdesk.jpg\"\u003e\u003cfigcaption\u003e\n\t\t\t\u003ch4\u003eOpen-source helpdesk\u003c/h4\u003e\n\t\t\u003c/figcaption\u003e\n\u003c/figure\u003e\n\n\u003ch2 id=\"what-is-open-source\"\u003eWhat is open-source?\u003c/h2\u003e\n\u003cp\u003eOpen-source is a term that refers to software that is free to use, modify, and distribute. This means that anyone can use the software for any purpose, and they can modify the software to suit their needs. Open-source software is typically developed by a community of developers who work together to create and maintain the software.\u003c/p\u003e"},{"title":"Kiota serializing","date_published":"2024-08-20T13:22:32Z","date_modified":"2024-08-20T13:22:32Z","id":"/2024/08/20/kiota-serializing/","url":"/2024/08/20/kiota-serializing/","tags":[".NET","Kiota"],"summary":"\u003cp\u003eUsing Kiota to serialize your data sounds like a great idea for my new project. But why should I care about Kiota serializing? Let\u0026rsquo;s find out!\u003c/p\u003e"},{"title":"Hyper-V template for Intune","date_published":"2024-08-02T12:08:43Z","date_modified":"2024-08-02T12:08:43Z","id":"/2024/08/02/hyper-v-template-intune/","url":"/2024/08/02/hyper-v-template-intune/","tags":["Intune","Hyper-V","Autopilot","Windows 11"],"summary":"\u003cp\u003eWant to test out autopilot device preparation in Hyper-V, but don\u0026rsquo;t know where to start? In this post, I\u0026rsquo;ll take you through the steps needed to create a Hyper-V virtual machine template for Intune.\u003c/p\u003e\n\u003cfigure\u003e\u003cimg src=\"/assets/images/2024/08/windows11_oobe.webp\"\u003e\u003cfigcaption\u003e\n\t\t\t\u003ch4\u003eWindows 11 Out-of-box-experience\u003c/h4\u003e\n\t\t\u003c/figcaption\u003e\n\u003c/figure\u003e\n\n\u003ch2 id=\"prerequisites\"\u003ePrerequisites\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eWindows 11 or Windows 10 (pro or enterprise)\u003c/li\u003e\n\u003cli\u003eHyper-V installed\u003c/li\u003e\n\u003cli\u003eWindows 11 ISO (pro or enterprise), with at least the may 2024 updates\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"create-a-new-virtual-machine\"\u003eCreate a new virtual machine\u003c/h2\u003e\n\u003col\u003e\n\u003cli\u003eOpen Hyper-V Manager\u003c/li\u003e\n\u003cli\u003eClick on \u003ccode\u003eAction\u003c/code\u003e and then \u003ccode\u003eNew\u003c/code\u003e and \u003ccode\u003eVirtual Machine\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eClick \u003ccode\u003eNext\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eChoose a name for the virtual machine, for example, \u003ccode\u003eIntuneTemplate\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e(optional) Choose a different location for the virtual machine\u003c/li\u003e\n\u003cli\u003eClick \u003ccode\u003eNext\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eChoose \u003ccode\u003eGeneration 2\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eClick \u003ccode\u003eNext\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eAssign at least 4GB of memory, (more is probably faster)\u003c/li\u003e\n\u003cli\u003eClick \u003ccode\u003eNext\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eSelect the virtual switch you want, I picked \u003ccode\u003eDefault Switch\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eClick \u003ccode\u003eNext\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eCreate a new virtual hard disk, size needs to be at least 30 GB, change the location if needed\u003c/li\u003e\n\u003cli\u003eClick \u003ccode\u003eNext\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eInstall an operating system from a bootable image file, select the Windows 11 ISO\u003c/li\u003e\n\u003cli\u003eClick \u003ccode\u003eNext\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eClick \u003ccode\u003eFinish\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eRight-click on the new virtual machine and click \u003ccode\u003eSettings\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eGo to \u003ccode\u003eSecurity\u003c/code\u003e and enable \u003ccode\u003eEnable Secure Boot\u003c/code\u003e and \u003ccode\u003eEnable TPM\u003c/code\u003e (needed for autopilot)\u003c/li\u003e\n\u003cli\u003eClick \u003ccode\u003eOK\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eRight click on the virtual machine and click \u003ccode\u003eConnect\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eIn the new window, click on \u003ccode\u003eStart\u003c/code\u003e and press any key to boot from the ISO\u003c/li\u003e\n\u003cli\u003eInstall Windows 11 as you would on a physical machine (next, next, \u0026hellip;)\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e\u003cstrong\u003eDon\u0026rsquo;t go through the OOBE (setup steps)!\u003c/strong\u003e instead continue with the next step in this guide.\u003c/p\u003e"},{"title":"Integration tests on protected API","date_published":"2024-07-10T09:54:59Z","date_modified":"2024-07-10T09:54:59Z","id":"/2024/07/10/integration-tests-protected-api/","url":"/2024/07/10/integration-tests-protected-api/","tags":[".NET","C#","OpenID Connect","API"],"summary":"\u003cp\u003eIf you built an api that is protected with tokens from an external IDP, you got a challenge when you want to run integration tests. They would require an access token that is signed by the IDP. And if you want to test several roles, or access levels or flows. You would need several \u0026ldquo;accounts\u0026rdquo; in your IDP. Not only that, but not all IDPs allow you to get all tokens in a non-interactive way. So you would need to have a browser open to get the tokens, which is not feasible for automated tests.\u003c/p\u003e\n\u003cfigure\u003e\u003ca href=\"#identity-proxy-in-testcontainers\"\u003e\u003cimg src=\"/assets/images/2024/07/test-with-identity-proxy.png\"\u003e\u003c/a\u003e\u003cfigcaption\u003e\n\t\t\t\u003ch4\u003eGenerate a token and use in integration test\u003c/h4\u003e\n\t\t\u003c/figcaption\u003e\n\u003c/figure\u003e"},{"title":"Kiota with dependency injection","date_published":"2024-07-03T13:51:47Z","date_modified":"2024-07-03T13:51:47Z","id":"/2024/07/03/kiota-dependency-injection/","url":"/2024/07/03/kiota-dependency-injection/","tags":[".NET","Kiota"],"summary":"\u003cp\u003eKiota is an \u003ca href=\"https://learn.microsoft.com/openapi/kiota/using?wt.mc_id=SEC-MVP-5004985\"\u003eopen-source application\u003c/a\u003e that allows you to generate a client for any api that is documented with open api. It\u0026rsquo;s a great tool and we use it for all our new projects where we call an api. What we also use in all our applications is dependency injection, and those two need to be combined to get the best performance and most stable application.\u003c/p\u003e\n\u003cfigure\u003e\u003ca href=\"https://learn.microsoft.com/openapi/kiota/tutorials/dotnet-dependency-injection?wt.mc_id=SEC-MVP-5004985\"\u003e\u003cimg src=\"/assets/images/2024/07/kiota-di.png\"\u003e\u003c/a\u003e\u003cfigcaption\u003e\n\t\t\t\u003ch4\u003eKiota Dependency Injection\u003c/h4\u003e\n\t\t\u003c/figcaption\u003e\n\u003c/figure\u003e\n\n\u003c!-- more --\u003e\n\u003ch2 id=\"why-use-dependency-injection\"\u003eWhy use dependency injection?\u003c/h2\u003e\n\u003cblockquote\u003e\n\u003cp\u003e\u003ca href=\"https://learn.microsoft.com/dotnet/core/extensions/dependency-injection?wt.mc_id=SEC-MVP-5004985\"\u003eDependency injection\u003c/a\u003e is a way to make your application more testable, maintainable, and scalable. It allows you to inject the dependencies into your classes, instead of creating them in the class. This way, you can easily replace the implementation of a class with another one, without changing the class itself. This is especially useful when you want to test your application, as you can easily mock the dependencies.\u003c/p\u003e"},{"title":"Authentication using certificate - Entra ID","date_published":"2024-06-05T11:05:42Z","date_modified":"2024-06-05T11:05:42Z","id":"/2024/06/05/authentication-certificate-key-vault/","url":"/2024/06/05/authentication-certificate-key-vault/","tags":["Client credentials","Entra ID","Authentication"],"summary":"\u003cp\u003eIf you want to do authentication for your multi-tenant application, you can use a secret (which you shouldn\u0026rsquo;t!) or a certificate. In almost all the samples I\u0026rsquo;ve seen, the certificate is stored in the Key Vault \u0026ldquo;to keep it safe\u0026rdquo;. But how does the authentication work? And are you sure this is the most secure way?\u003c/p\u003e\n\u003cdiv style=\"position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;\"\u003e\n\t\t\t\u003ciframe allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen\" loading=\"eager\" referrerpolicy=\"strict-origin-when-cross-origin\" src=\"https://www.youtube.com/embed/NFeufptAoZE?autoplay=0\u0026amp;controls=1\u0026amp;end=0\u0026amp;loop=0\u0026amp;mute=0\u0026amp;start=0\" style=\"position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;\" title=\"YouTube video\"\u003e\u003c/iframe\u003e\n\t\t\u003c/div\u003e\n\n\u003c!-- more --\u003e\n\u003ch2 id=\"process\"\u003eProcess\u003c/h2\u003e\n\u003cp\u003eThe short version of the process is:\u003c/p\u003e"},{"title":"What have you been up to?","date_published":"2024-05-21T19:40:00Z","date_modified":"2024-05-21T19:40:00Z","id":"/2024/05/21/what-have-you-been-up-to/","url":"/2024/05/21/what-have-you-been-up-to/","tags":[],"summary":"\u003cp\u003eIt has been pretty quite on this blog, are you still blogging? What is snooping up all the time you usually got for writing blog posts?\u003c/p\u003e\n\u003cfigure\u003e\u003ca href=\"https://www.linkedin.com/feed/update/urn:li:activity:7196965303044505601/\"\u003e\u003cimg src=\"/assets/images/2024/05/security-coin-microsoft-security-nl.jpg\"\u003e\u003c/a\u003e\u003cfigcaption\u003e\n\t\t\t\u003ch4\u003eMy first security coin\u003c/h4\u003e\n\t\t\u003c/figcaption\u003e\n\u003c/figure\u003e"},{"title":"Azure SQL and Entra ID authentication, tips from the field","date_published":"2024-03-27T14:28:30Z","date_modified":"2024-03-27T14:28:30Z","id":"/2024/03/27/azure-sql-entra-id-tips/","url":"/2024/03/27/azure-sql-entra-id-tips/","tags":["Azure","Managed Identity","Azure SQL"],"summary":"\u003cp\u003eAzure SQL is a managed SQL server in the cloud. It\u0026rsquo;s a great service, but it can be a bit tricky to get it to work with Entra ID Authentication. Here are some tips from the field.\u003c/p\u003e\n\u003cfigure\u003e\u003cimg src=\"/assets/images/2024/03/azure-sql-select-admin.png\"\u003e\u003cfigcaption\u003e\n\t\t\t\u003ch4\u003eAzure SQL Entra ID Admin required\u003c/h4\u003e\n\t\t\u003c/figcaption\u003e\n\u003c/figure\u003e"},{"title":"Azure Pipelines and commit messages","date_published":"2024-03-27T11:18:06Z","date_modified":"2024-03-27T11:18:06Z","id":"/2024/03/27/azure-pipelines-commit-messages/","url":"/2024/03/27/azure-pipelines-commit-messages/","tags":["Azure","Azure DevOps","Azure Pipelines"],"summary":"\u003cp\u003eIt\u0026rsquo;s just a little frustration this time, I was creating a new Azure Pipeline, and I was testing the deployment steps. After 2 PR\u0026rsquo;s to the main branch, which should be configured as the correct trigger, I was still having issues.\u003c/p\u003e\n\u003cp\u003eIn the mean time my commit messages in the main branch will stay there forever.\u003c/p\u003e\n\u003cfigure\u003e\u003cimg src=\"/assets/images/2024/03/pipeline-failure.png\"\u003e\u003cfigcaption\u003e\n\t\t\t\u003ch4\u003eFinally success after so many tries\u003c/h4\u003e\n\t\t\u003c/figcaption\u003e\n\u003c/figure\u003e"},{"title":"MVP Summit 2024","date_published":"2024-03-24T16:27:13Z","date_modified":"2024-03-24T16:27:13Z","id":"/2024/03/24/mvp-summit-2024/","url":"/2024/03/24/mvp-summit-2024/","tags":["MVP Summit"],"summary":"\u003cp\u003eDid you know each \u003ca href=\"https://mvp.microsoft.com/?wt.mc_id=SEC-MVP-5004985\"\u003eMicrosoft MVP\u003c/a\u003e is invited to a yearly \u003ca href=\"https://summit.microsoft.com/?wt.mc_id=SEC-MVP-5004985\"\u003eMVP Summit\u003c/a\u003e? As one of those \u003ca href=\"https://mvp.microsoft.com/en-US/MVP/profile/cc128f12-003f-ed11-bba3-000d3a197333?wt.mc_id=SEC-MVP-5004985\"\u003efew\u003c/a\u003e, I was invited for the 2024 MVP summit.\u003c/p\u003e\n\u003cp\u003eThis was my first summit, and boy what a trip. Seeing my own name on the MVP wall, between all those other people really made an impression.\u003c/p\u003e\n\u003cfigure\u003e\u003cimg src=\"/assets/images/2024/03/stephan_mvp_wall.jpg\"\u003e\u003cfigcaption\u003e\n\t\t\t\u003ch4\u003eMVP wall\u003c/h4\u003e\n\t\t\u003c/figcaption\u003e\n\u003c/figure\u003e"},{"title":"Never forget the Authorize attribute","date_published":"2024-03-05T13:37:55Z","date_modified":"2024-03-05T13:37:55Z","id":"/2024/03/05/forget-authorize-attribute/","url":"/2024/03/05/forget-authorize-attribute/","tags":[".NET Core","Security","Security-shorts"],"summary":"\u003cp\u003eDid you ever deploy an application and forgot to add the \u003ccode\u003e[Authorize]\u003c/code\u003e attribute to a controller or action? I did, and it meant that the application was open to the public and one controller could be used without logging in. Let me show you how you can use reflection and \u003ca href=\"https://fluentassertions.com/\"\u003eFluent Assertions\u003c/a\u003e to check for the existence of an attribute on a specific class. I\u0026rsquo;m using this to verify the \u003ccode\u003eAuthorize\u003c/code\u003e attribute on all classed that inherit from \u003ccode\u003eControllerBase\u003c/code\u003e in a .NET Core application, but this principle can be used on any class to check for the existence of a specific attribute.\u003c/p\u003e\n\u003cfigure\u003e\u003cimg src=\"/assets/images/2024/03/lego-developer-and-security-guard.png\"\u003e\u003cfigcaption\u003e\n\t\t\t\u003ch4\u003eLego mini figures developer and security guard\u003c/h4\u003e\n\t\t\u003c/figcaption\u003e\n\u003c/figure\u003e"},{"title":"Modify a HttpClientHandler with Dependency Injection","date_published":"2024-02-27T13:35:59Z","date_modified":"2024-02-27T13:35:59Z","id":"/2024/02/27/modify-httpclienthandler-dependency-injection/","url":"/2024/02/27/modify-httpclienthandler-dependency-injection/","tags":[".NET Core","Security"],"summary":"\u003cp\u003eIn the \u003ca href=\"/2024/02/22/nuke-man-middle-attack\"\u003eprevious post\u003c/a\u003e we have seen how you can protect your application to Man-in-the-middle attacks. The sample code there, was not showing how you could do the same if you are not managing the HttpClient yourself. In this post we will see how you can utilize this with dependency injection and the \u003ccode\u003eMicrosoft.Extensions.Http\u003c/code\u003e package, which allows you to also protect your application if you\u0026rsquo;re using dependency injection to manage your \u003ccode\u003eHttpClient\u003c/code\u003e instances.\u003c/p\u003e\n\u003cfigure\u003e\u003cimg src=\"/assets/images/2024/02/hacker-with-magnifying-glass-cartoon-style.png\"\u003e\n\u003c/figure\u003e"},{"title":"Nuke the man-in-the-middle attack","date_published":"2024-02-22T13:18:53Z","date_modified":"2024-02-22T13:18:53Z","id":"/2024/02/22/nuke-man-middle-attack/","url":"/2024/02/22/nuke-man-middle-attack/","tags":[".NET Core","API","Graph API"],"summary":"\u003cp\u003eEverybody should take security seriously! Let\u0026rsquo;s see what you can do to do the extra step to protect your applications. In this post we will have a look at how you can protect your application from Man-in-the-middle attacks.\u003c/p\u003e\n\u003cfigure\u003e\u003cimg src=\"/assets/images/2024/02/hacker-with-magnifying-glass-cartoon-style-and-a-police-with-a-baseball-bat.png\"\u003e\n\u003c/figure\u003e\n\n\u003c!-- more --\u003e\n\u003ch2 id=\"man-in-the-middle\"\u003eMan-in-the-middle\u003c/h2\u003e\n\u003cp\u003eWhat is a man-in-the-middle attack? It means the attacker has found a way to intercept the traffic between two parties. This is a serious problem, because the attacker can read, modify and even delete the traffic. This is a serious problem for users, but also for applications.\u003c/p\u003e"},{"title":"Validate JWT with OpenID Connect","date_published":"2024-02-22T10:55:07Z","date_modified":"2024-02-22T10:55:07Z","id":"/2024/02/22/validate-jwt-openid-connect/","url":"/2024/02/22/validate-jwt-openid-connect/","tags":["OpenID Connect","Security","jwt"],"summary":"\u003cp\u003eWorking with API\u0026rsquo;s, or calling the Microsoft Graph API, you\u0026rsquo;ve probably seen them those JSON Web Tokens (or JWT for short). It\u0026rsquo;s a way to securely transmit information between parties. But how do you validate them? In this post, I\u0026rsquo;ll show you how to validate a JWT using OpenID Connect.\u003c/p\u003e\n\u003cfigure\u003e\u003cimg src=\"/assets/images/2024/02/jwt-title.png\"\u003e\u003cfigcaption\u003e\n\t\t\t\u003ch4\u003eJWT title screen\u003c/h4\u003e\n\t\t\u003c/figcaption\u003e\n\u003c/figure\u003e\n\n\u003c!-- more --\u003e\n\u003ch2 id=\"what-is-a-jwt\"\u003eWhat is a JWT\u003c/h2\u003e\n\u003cp\u003eA JSON Web Token (JWT) is a compact, URL-safe means of representing claims to be transferred between two parties. A JWT consists of three parts separated by dots (\u003ccode\u003e.\u003c/code\u003e):\u003c/p\u003e"},{"title":"Local API for appliances","date_published":"2024-01-21T09:57:06Z","date_modified":"2024-01-21T09:57:06Z","id":"/2024/01/21/local-api-appliances/","url":"/2024/01/21/local-api-appliances/","tags":["Home Automation","Security","API"],"summary":"\u003cp\u003eI\u0026rsquo;m a home automation enthusiast, so that\u0026rsquo;s out. I\u0026rsquo;ve been using various systems for years, I even build some home automation packages, like \u003ca href=\"https://sonos2mqtt.svrooij.io\"\u003esonos2mqtt\u003c/a\u003e and \u003ca href=\"https://github.com/svrooij/ipcam2mqtt\"\u003eipcam2mqtt\u003c/a\u003e. When buying devices I always look for devices that have a local API, so I can integrate them in my home automation system. Devices that require the cloud to be controllable are getting a points deduction when comparing devices.\u003c/p\u003e\n\u003cp\u003eIn my opinion all devices should have a local api, and if they have a cloud api, it should be optional. I don\u0026rsquo;t want to be forced to use the cloud and I want to be able to control my devices locally.\u003c/p\u003e\n\u003cp\u003eI discovered that my \u003ca href=\"/2023/01/25/disconnect-your-smart-appliance/\"\u003eoven talks to questionable countries\u003c/a\u003e so I disconnected it from the internet. Recently \u003ca href=\"https://www.bleepingcomputer.com/news/security/haier-hits-home-assistant-plugin-dev-with-takedown-notice/\"\u003eHaier threatened an open-source developer\u003c/a\u003e with legal action because he made a home assistant plugin for his own Haier applicance.\u003c/p\u003e\n\u003cfigure\u003e\u003cimg src=\"/assets/images/2024/01/dishwasher-cloud.png\"\u003e\u003cfigcaption\u003e\n\t\t\t\u003ch4\u003eDishwasher on a cloud\u003c/h4\u003e\n\t\t\u003c/figcaption\u003e\n\u003c/figure\u003e"},{"title":"Using dependency injection in your C# PowerShell Modules","date_published":"2024-01-18T14:57:21Z","date_modified":"2024-01-18T14:57:21Z","id":"/2024/01/18/dependencies-powershell-module-csharp/","url":"/2024/01/18/dependencies-powershell-module-csharp/","tags":["C#","PowerShell","PowerShell Module","PowerShell Development"],"summary":"\u003cp\u003eFor those following along, this is the second post in a series about PowerShell development in C#. In the \u003ca href=\"/2024/01/12/create-powershell-module-csharp/\"\u003efirst post\u003c/a\u003e I showed you how to create a binary PowerShell module in C# and how to debug it in Visual Studio. This post will continue this journey and show you how to use dependency injection in your binary PowerShell module.\u003c/p\u003e\n\u003cfigure\u003e\u003cimg src=\"/assets/images/2024/01/powershell-dependency-injection.png\"\u003e\u003cfigcaption\u003e\n\t\t\t\u003ch4\u003eDependency injection and async code in PowerShell\u003c/h4\u003e\n\t\t\u003c/figcaption\u003e\n\u003c/figure\u003e"},{"title":"Stop asking for passwords","date_published":"2024-01-16T12:04:07Z","date_modified":"2024-01-16T12:04:07Z","id":"/2024/01/16/stop-asking-for-passwords/","url":"/2024/01/16/stop-asking-for-passwords/","tags":["Security","Best Practices"],"summary":"\u003cp\u003eIt\u0026rsquo;s been common practice for a long time to ask for passwords, surely we are migrating to passwordless authentication, but we are not there yet. So, what can we do to improve the security of our applications? What about setting a sign-in frequency?\u003c/p\u003e\n\u003cfigure\u003e\u003cimg src=\"/assets/images/2024/01/banner-ask-for-password.png\"\u003e\u003cfigcaption\u003e\n\t\t\t\u003ch4\u003eLaptop asking for password\u003c/h4\u003e\n\t\t\u003c/figcaption\u003e\n\u003c/figure\u003e\n\n\u003cblockquote\u003e\n\u003cp\u003eThis is an opinionated post, I\u0026rsquo;m looking at this from the perspective of a security consultant that wants the best solution for the users, while still preserving security. I want to open a discussion about this topic, so please leave a comment if you have a different opinion.\u003c/p\u003e\n\u003c/blockquote\u003e"},{"title":"Automate your SSH keys using GitHub","date_published":"2024-01-15T10:29:18Z","date_modified":"2024-01-15T10:29:18Z","id":"/2024/01/15/automate-ssh-with-github/","url":"/2024/01/15/automate-ssh-with-github/","tags":["SSH","Administration"],"summary":"\u003cp\u003eUsing \u003ca href=\"/2024/01/01/secure-ssh-windows-hello/\"\u003eWindows Hello for SSH keys\u003c/a\u003e makes sure your SSH keys are secure, it also means that they are tied to a single computer. If you only have one computer that should not be too much trouble. But if you\u0026rsquo;re one of those users that uses multiple computers. You\u0026rsquo;ll need to distribute all those SSH keys to all the computers you want to use them on. Let me show you how you can automate distributing your SSH keys using GitHub.\u003c/p\u003e"},{"title":"Create your first PowerShell module with C#","date_published":"2024-01-12T15:00:58Z","date_modified":"2024-01-12T15:00:58Z","id":"/2024/01/12/create-powershell-module-csharp/","url":"/2024/01/12/create-powershell-module-csharp/","tags":["C#","PowerShell","PowerShell Module","PowerShell Development"],"summary":"\u003cp\u003eLet\u0026rsquo;s say you have a C# project and you want to create a PowerShell module for it. Creating a PowerShell module for you project allows anyone to use your project without installing the .NET SDK or compiling the project.\nIf your target audience consists mainly of system administrators, they will be more comfortable using PowerShell than compiling a C# project.\u003c/p\u003e\n\u003cp\u003eIn this post I\u0026rsquo;ll show you how to create a \u003cstrong\u003ebinary\u003c/strong\u003e PowerShell module, which means you\u0026rsquo;ll be writing your \u003cem\u003ecommand lets\u003c/em\u003e in C# and not in PowerShell.\u003c/p\u003e"},{"title":"Secure SSH with Windows Hello","date_published":"2024-01-01T12:39:18Z","date_modified":"2024-01-01T12:39:18Z","id":"/2024/01/01/secure-ssh-windows-hello/","url":"/2024/01/01/secure-ssh-windows-hello/","tags":["SSH","Administration","PowerShell"],"summary":"\u003cp\u003eYou currently have all these security keys these days that allow you to securely store your ssh private keys on a device to prevent them from being stolen. But what if you could use your face to unlock your ssh keys? Well, you can! And it\u0026rsquo;s pretty easy to set up.\u003c/p\u003e"},{"title":"Speaking at ESPC23 - Protect your API with Entra ID","date_published":"2023-12-03T12:02:36Z","date_modified":"2023-12-03T12:02:36Z","id":"/2023/12/03/speaking-espc23-protect-api-entra-id/","url":"/2023/12/03/speaking-espc23-protect-api-entra-id/","tags":["ESPC23","Entra ID","Azure AD","jwt","Public Speaking"],"summary":"\u003cp\u003eI got accepted to speak at \u003ca href=\"https://www.sharepointeurope.com/conference/schedule/2023/\"\u003eESPC23\u003c/a\u003e the European SharePoint, Office 365 \u0026amp; Azure Conference in 2023. As a Microsoft MVP in Security, the topic has to be security related.\u003c/p\u003e\n\u003cfigure\u003e\u003cimg src=\"/assets/images/2023/11/ps_protect_your_api_with_azure_ad.jpeg\"\u003e\u003cfigcaption\u003e\n\t\t\t\u003ch4\u003eMe in front of this huge screen\u003c/h4\u003e\n\t\t\u003c/figcaption\u003e\n\u003c/figure\u003e"},{"title":"How do Federated credentials in GitHub Actions actually work","date_published":"2023-11-07T10:44:57Z","date_modified":"2023-11-07T10:44:57Z","id":"/2023/11/07/github-actions-federated-credentials-explained/","url":"/2023/11/07/github-actions-federated-credentials-explained/","tags":["Managed Identity","Managed Identity Shorts","Federated Credentials"],"summary":"\u003cp\u003eI\u0026rsquo;m super enthusiastic about \u003ca href=\"https://learn.microsoft.com/entra/identity/managed-identities-azure-resources/overview?wt.mc_id=SEC-MVP-5004985\"\u003emanaged identities\u003c/a\u003e, because it allows you to deploy your application without having to worry about credentials. Federated credentials are a way to accomplish the same for none Azure resources. You can use federated credentials to authenticate several tasks inside Github Actions, and thus securely deploy your app to Azure without the need of a secret configured in GitHub.\u003c/p\u003e\n\u003cp\u003eAs the regular readers might expect this post will explain how federated credentials actually work inside GitHub Actions, a deep dive into the techniques that are actually driving this feature.\u003c/p\u003e\n\u003cfigure\u003e\u003cimg src=\"/assets/images/2023/11/github-actions-federated-token.png\"\u003e\u003cfigcaption\u003e\n\t\t\t\u003ch4\u003eGet a federation token from GitHub\u003c/h4\u003e\n\t\t\u003c/figcaption\u003e\n\u003c/figure\u003e"},{"title":"Creating IntuneWin files with C#","date_published":"2023-10-24T12:53:59Z","date_modified":"2023-10-24T12:53:59Z","id":"/2023/10/24/create-intunewin-file/","url":"/2023/10/24/create-intunewin-file/","tags":["Intune","Content Prep"],"summary":"\u003cp\u003eNow that I figured out how to \u003ca href=\"/2023/10/09/decrypting-intunewin-files/\"\u003edecrypt IntuneWin files\u003c/a\u003e it is time to explain how you can create those files with just C# code. With this explanation you should be able to create IntuneWin files on any platform, that supports the .NET framework. And depending on your skills you might be able to port this code to other languages as well.\u003c/p\u003e\n\u003cfigure\u003e\u003cimg src=\"/assets/images/2023/10/open-source-content-prep.gif\"\u003e\u003cfigcaption\u003e\n\t\t\t\u003ch4\u003eSuper fast Content Prep\u003c/h4\u003e\n\t\t\u003c/figcaption\u003e\n\u003c/figure\u003e"},{"title":"Introducing Content Prep PowerShell","date_published":"2023-10-19T12:34:58Z","date_modified":"2023-10-19T12:34:58Z","id":"/2023/10/19/open-source-intune-content-prep/","url":"/2023/10/19/open-source-intune-content-prep/","tags":["Intune","Content Prep","PowerShell"],"summary":"\u003cp\u003eJourney until now, I created \u003ca href=\"https://github.com/svrooij/wingetintune\"\u003eWingetIntune on GitHub\u003c/a\u003e, an open-source app packager that downloads all the details from Winget and then packages the installer for Intune. In that \u003ca href=\"/2023/10/09/decrypting-intunewin-files/\"\u003elast post\u003c/a\u003e I dove intune decrypting \u003ccode\u003e.intunewin\u003c/code\u003e files. With the end goal of being able to create those files with pure C# code. And I\u0026rsquo;m happy to announce that I succeeded in doing so.\u003c/p\u003e\n\u003cfigure\u003e\u003cimg src=\"/assets/images/2023/10/open-source-content-prep.gif\"\u003e\u003cfigcaption\u003e\n\t\t\t\u003ch4\u003eSuper fast Content Prep\u003c/h4\u003e\n\t\t\u003c/figcaption\u003e\n\u003c/figure\u003e"},{"title":"Decrypting intunewin files","date_published":"2023-10-09T15:32:00Z","date_modified":"2023-10-09T15:32:00Z","id":"/2023/10/09/decrypting-intunewin-files/","url":"/2023/10/09/decrypting-intunewin-files/","tags":["Intune"],"summary":"\u003cp\u003eIn my quest to build an open-source, cross platform, tool that packages Win32 apps from Winget for Intune \u003ca href=\"https://github.com/svrooij/wingetintune\"\u003eWingetIntune on GitHub\u003c/a\u003e, I\u0026rsquo;ve been looking at the Win32 Content Prep Tool in my \u003ca href=\"/2023/10/04/analysing-win32-content-prep-tool/\"\u003eprevious post\u003c/a\u003e. In this post I\u0026rsquo;ll try to decrypt the \u003ccode\u003eIntunePackage.intunewin\u003c/code\u003e file that is generated by the tool.\u003c/p\u003e\n\u003cfigure\u003e\u003cimg src=\"/assets/images/2023/10/Unlock-IntuneWinPackage.png\"\u003e\u003cfigcaption\u003e\n\t\t\t\u003ch4\u003ePowerShell module to create and decrypt .intunewin files\u003c/h4\u003e\n\t\t\u003c/figcaption\u003e\n\u003c/figure\u003e"},{"title":"Analysing Win32 Content Prep Tool","date_published":"2023-10-04T08:05:41Z","date_modified":"2023-10-04T08:05:41Z","id":"/2023/10/04/analysing-win32-content-prep-tool/","url":"/2023/10/04/analysing-win32-content-prep-tool/","tags":["Intune"],"summary":"\u003cp\u003eIn my quest to build an open-source, cross platform, tool that packages Win32 apps from Winget for Intune \u003ca href=\"https://github.com/svrooij/wingetintune\"\u003eWingetIntune on GitHub\u003c/a\u003e, I\u0026rsquo;ve been looking at the Win32 Content Prep Tool. This tool is used by administrators to prepare Win32 apps for deployment in Intune. It\u0026rsquo;s a closed source application requiring windows to run. In this post I\u0026rsquo;ll be looking at the tool and how it works.\u003c/p\u003e\n\u003cfigure\u003e\u003cimg src=\"/assets/images/2023/10/detection_xml.png\"\u003e\u003cfigcaption\u003e\n\t\t\t\u003ch4\u003eDetection.xml file from .intunewin\u003c/h4\u003e\n\t\t\u003c/figcaption\u003e\n\u003c/figure\u003e"},{"title":"Compute file hash in C# asynchronously","date_published":"2023-10-03T14:58:44Z","date_modified":"2023-10-03T14:58:44Z","id":"/2023/10/03/compute-file-hash-asynchronously/","url":"/2023/10/03/compute-file-hash-asynchronously/","tags":["C#"],"summary":"\u003cp\u003eIn my recent quest I\u0026rsquo;ve been building a tool that publishes any apps from winget to Intune, called \u003ca href=\"https://github.com/svrooij/wingetintune\"\u003eWingetIntune\u003c/a\u003e. One of the things that was still on the todo list was to compute and check the hash of the installer. We wouldn\u0026rsquo;t want to package a corrupted or maliciously changed installer, right?\u003c/p\u003e\n\u003cp\u003eSince I\u0026rsquo;m building my application with the cloud in mind, using synchronous code is a big no-no. So I went looking for a way to compute the hash of a file asynchronously. Only to find out there is no such thing in \u003ccode\u003e.NETStandard 2.0\u003c/code\u003e which I was targeting.\u003c/p\u003e\n\u003cfigure\u003e\u003cimg src=\"/assets/images/2023/10/file-hash-async.png\"\u003e\u003cfigcaption\u003e\n\t\t\t\u003ch4\u003eCompute file hash asynchronously\u003c/h4\u003e\n\t\t\u003c/figcaption\u003e\n\u003c/figure\u003e"},{"title":"Remove platform dependency for WingetIntune","date_published":"2023-09-23T10:55:03Z","date_modified":"2023-09-23T10:55:03Z","id":"/2023/09/23/winget-intune-windows-deps/","url":"/2023/09/23/winget-intune-windows-deps/","tags":["Intune"],"summary":"\u003cp\u003e\u003ca href=\"https://github.com/svrooij/wingetintune\"\u003eWingetIntune\u003c/a\u003e, my latest open-source project to publish apps to Intune, has a dependency on Windows. This post explains why and how I\u0026rsquo;m planning to remove that dependency.\u003c/p\u003e\n\u003cfigure\u003e\u003cimg src=\"/assets/images/2023/09/winget-package-index.png\"\u003e\u003cfigcaption\u003e\n\t\t\t\u003ch4\u003eOpen-source winget community index\u003c/h4\u003e\n\t\t\u003c/figcaption\u003e\n\u003c/figure\u003e"},{"title":"Publish apps to Intune","date_published":"2023-08-31T08:57:38Z","date_modified":"2023-08-31T08:57:38Z","id":"/2023/08/31/publish-apps-to-intune/","url":"/2023/08/31/publish-apps-to-intune/","tags":["Intune"],"summary":"\u003cp\u003eI\u0026rsquo;ve been taking you through the process of getting you apps in Intune. In the \u003ca href=\"/2023/08/30/package-apps-for-intune/\"\u003eprevious post\u003c/a\u003e I explained how to package apps for Intune. In this post I\u0026rsquo;ll go into publishing apps to Intune.\u003c/p\u003e\n\u003cfigure\u003e\u003cimg src=\"/assets/images/2023/08/publish-app-in-seconds-intune.gif\"\u003e\u003cfigcaption\u003e\n\t\t\t\u003ch4\u003ePublish an app in seconds\u003c/h4\u003e\n\t\t\u003c/figcaption\u003e\n\u003c/figure\u003e"},{"title":"Package apps for Intune","date_published":"2023-08-30T19:58:20Z","date_modified":"2023-08-30T19:58:20Z","id":"/2023/08/30/package-apps-intune/","url":"/2023/08/30/package-apps-intune/","tags":["Intune"],"summary":"\u003cp\u003eIn the \u003ca href=\"/2023/08/30/apps-intune/\"\u003eprevious post\u003c/a\u003e I explained that you can use Intune to install applications for all you colleagues. In this post I\u0026rsquo;ll go into packaging apps for Intune\u003c/p\u003e\n\u003cfigure\u003e\u003cimg src=\"/assets/images/2023/08/package-intune-app.png\"\u003e\u003cfigcaption\u003e\n\t\t\t\u003ch4\u003ePackage an app in seconds\u003c/h4\u003e\n\t\t\u003c/figcaption\u003e\n\u003c/figure\u003e"},{"title":"Get your apps in Intune","date_published":"2023-08-30T10:00:10Z","date_modified":"2023-08-30T10:00:10Z","id":"/2023/08/30/apps-intune/","url":"/2023/08/30/apps-intune/","tags":["Clean install","Intune"],"summary":"\u003cp\u003eMicrosoft has this great tool to manage corporate devices, called Intune. Companies use it to manage their devices, and to deploy apps to them. But how do you get your apps in Intune? In this post I will explain how to get your apps in Intune, and how to deploy them to your devices.\u003c/p\u003e\n\u003cfigure\u003e\u003cimg src=\"/assets/images/2023/08/company-portal.png\"\u003e\u003cfigcaption\u003e\n\t\t\t\u003ch4\u003eApps in Company Portal\u003c/h4\u003e\n\t\t\u003c/figcaption\u003e\n\u003c/figure\u003e"},{"title":"The Best GitHub workflow for a .NET app","date_published":"2023-08-09T15:11:47Z","date_modified":"2023-08-09T15:11:47Z","id":"/2023/08/09/best-github-workflow-net-app/","url":"/2023/08/09/best-github-workflow-net-app/","tags":[".NET","Github Actions"],"summary":"\u003cp\u003eI might have build the best continues integration pipeline for a .NET app ever. How do you set up a workflow to automatically test your .NET application? I\u0026rsquo;ve created a \u003ca href=\"https://github.com/svrooij/sonos-net/actions/workflows/build.yml\"\u003eworkflow\u003c/a\u003e that has all the things you might need to get started.\u003c/p\u003e\n\u003cfigure\u003e\u003cimg src=\"/assets/images/2023/08/github-action-result.png\"\u003e\u003cfigcaption\u003e\n\t\t\t\u003ch4\u003eGithub actions build summary\u003c/h4\u003e\n\t\t\u003c/figcaption\u003e\n\u003c/figure\u003e"},{"title":"Emulate Managed Identities during development","date_published":"2023-08-03T07:38:58Z","date_modified":"2023-08-03T07:38:58Z","id":"/2023/08/03/emulate-managed-identities/","url":"/2023/08/03/emulate-managed-identities/","tags":["Managed Identity","Developer"],"summary":"\u003cp\u003eEver used Managed Identities in Azure? You should, it\u0026rsquo;s a great way to get rid off passwords in your code and configuration. In this post I\u0026rsquo;ll show you how managed identities actually work. And how I built a small app that should help you use the \u003ccode\u003eManagedIdentityCredential\u003c/code\u003e in Docker and or during development.\u003c/p\u003e\n\u003cfigure\u003e\u003cimg src=\"/assets/images/2023/08/managed-identity-in-docker.png\"\u003e\u003cfigcaption\u003e\n\t\t\t\u003ch4\u003eApp running in docker using Managed Identity\u003c/h4\u003e\n\t\t\u003c/figcaption\u003e\n\u003c/figure\u003e"},{"title":"Use System.Text.Json in Azure Functions","date_published":"2023-07-26T10:06:24Z","date_modified":"2023-07-26T10:06:24Z","id":"/2023/07/26/system-text-json-azure-functions/","url":"/2023/07/26/system-text-json-azure-functions/","tags":["Azure Functions"],"summary":"\u003cp\u003eIn 2019 Microsoft has \u003ca href=\"https://devblogs.microsoft.com/dotnet/try-the-new-system-text-json-apis/\"\u003ereleased\u003c/a\u003e some new build-in API\u0026rsquo;s to (de/)serialize JSON. All the API\u0026rsquo;s in the \u003ccode\u003eSystem.Text.Json\u003c/code\u003e namespace should allow you to work with \u003ca href=\"https://en.wikipedia.org/wiki/JSON\"\u003eJavaScript Object Notation\u003c/a\u003e files without the need for \u003ca href=\"#newtonsoftjson\"\u003eNewtonsoft.JSON\u003c/a\u003e, the longtime go-to library to handle JSON. In this post I\u0026rsquo;ll explorer how to use the new api\u0026rsquo;s right from Azure Functions C#.\u003c/p\u003e"},{"title":"Fake banking security","date_published":"2023-07-24T14:13:01Z","date_modified":"2023-07-24T14:13:01Z","id":"/2023/07/24/fake-banking-security/","url":"/2023/07/24/fake-banking-security/","tags":["Banking"],"summary":"\u003cp\u003eI have this bank account, at a bank (I will not shame publicly for now), but I\u0026rsquo;m really frustrated with their \u0026ldquo;fake\u0026rdquo; security. I don\u0026rsquo;t own a bank, nor do I work for one, but in my opinion they should think differently about security. I also provide some alternative security measures that I thought up myself.\u003c/p\u003e\n\u003cp\u003e\u003cfigure\u003e\u003cimg src=\"/assets/images/2023/07/pexels-cottonbro-studio-8720586.jpg\"\u003e\u003cfigcaption\u003e\n\t\t\t\u003ch4\u003ePhoto by cottonbro studio\u003c/h4\u003e\n\t\t\u003c/figcaption\u003e\n\u003c/figure\u003e\n \u003c!-- Photo by cottonbro studio: https://www.pexels.com/photo/a-woman-typing-on-the-keyboard-8720586/ --\u003e\u003c/p\u003e"},{"title":"Configure SQL with managed identity","date_published":"2023-07-19T13:42:02Z","date_modified":"2023-07-19T13:42:02Z","id":"/2023/07/19/configure-sql-managed-identity/","url":"/2023/07/19/configure-sql-managed-identity/","tags":["Managed Identity","Managed Identity Shorts"],"summary":"\u003cp\u003eThis post will show you how we configure Azure SQL Server with a \u003ca href=\"https://learn.microsoft.com/azure/active-directory/managed-identities-azure-resources/overview?wt.mc_id=SEC-MVP-5004985\"\u003emanaged identity\u003c/a\u003e, it will also show you the most common pitfalls.\u003c/p\u003e\n\u003cfigure\u003e\u003cimg src=\"/assets/images/2023/07/sql-managed-identity.png\"\u003e\u003cfigcaption\u003e\n\t\t\t\u003ch4\u003eConfigure Azure Groups as database users\u003c/h4\u003e\n\t\t\u003c/figcaption\u003e\n\u003c/figure\u003e"},{"title":"VanMoof going bankrupt, what about my digital bike key?","date_published":"2023-07-17T17:39:19Z","date_modified":"2023-07-17T17:39:19Z","id":"/2023/07/17/own-stuff-cloud-dependency/","url":"/2023/07/17/own-stuff-cloud-dependency/","tags":["Optional cloud"],"summary":"\u003cp\u003eA few days ago VanMoof (a Dutch E-bike vendor) applied for a \u003ca href=\"https://minerva-advocaten.nl/en/news/suspension-of-payment\"\u003esuspension of payment\u003c/a\u003e, this usually means the company might go bankrupt in the near future. What does that mean for their customers? In this post I\u0026rsquo;ll share some toughs on the cloud dependency products have these days.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eThere was a tweet here, but it is deleted forever.\u003c/p\u003e\n\u003c/blockquote\u003e"},{"title":"Hiding in plain Graph, an issue with Azure AD Audit log","date_published":"2023-07-07T11:27:01Z","date_modified":"2023-07-07T11:27:01Z","id":"/2023/07/07/hiding-plain-graph-azure-ad-audit-issue/","url":"/2023/07/07/hiding-plain-graph-azure-ad-audit-issue/","tags":["Azure AD","Security","Teams Hacktogether"],"summary":"\u003cp\u003eThe \u003ca href=\"#audit-log\"\u003eaudit log\u003c/a\u003e in Azure AD in super important. If I was an attacker that got access to some tenant, I would make sure my details would not show up in there. I would probably use a VPN/TOR of sorts just to hide my tracks. But what if I tell you that the Microsoft Graph API does already covers your tracks?\u003c/p\u003e\n\u003cfigure\u003e\u003cimg src=\"/assets/images/2023/06/audit-log-azure-ad-masked.png\"\u003e\u003cfigcaption\u003e\n\t\t\t\u003ch4\u003eNot my IP showing in the audit log\u003c/h4\u003e\n\t\t\u003c/figcaption\u003e\n\u003c/figure\u003e"},{"title":"Blog migrated to hugo on Static Web Apps","date_published":"2023-06-26T14:23:33Z","date_modified":"2023-06-26T14:23:33Z","id":"/2023/06/26/blog-migrated-to-hugo-on-static-web-apps/","url":"/2023/06/26/blog-migrated-to-hugo-on-static-web-apps/","tags":["Azure","Static Web App","New Blog"],"summary":"\u003cp\u003eThe blog you\u0026rsquo;re currently reading is a written in Markdown, then an application runs and generates static html files. This is called a \u003ca href=\"https://jamstack.org/generators/\"\u003estatic site generator\u003c/a\u003e, there are several static site generators. Previously I used \u003ca href=\"https://jekyllrb.com/\"\u003eJekyll\u003c/a\u003e and recently I decided it was time for something new, I migrated to \u003ca href=\"https://gohugo.io/\"\u003eHugo\u003c/a\u003e. Let my explain why I did this and what was needed to make this happen.\u003c/p\u003e"},{"title":"Teams Hacktogether: Entry","date_published":"2023-06-22T08:21:17Z","date_modified":"2023-06-22T08:21:17Z","id":"/2023/06/22/teams-hacktogether-entry/","url":"/2023/06/22/teams-hacktogether-entry/","tags":["Microsoft Teams","Teams Hacktogether"],"summary":"\u003cp\u003eMicrosoft organized a \u003ca href=\"https://github.com/microsoft/hack-together-teams\"\u003eTeams Hacktogether\u003c/a\u003e hackathon, we had a great \u003ca href=\"/2023/06/12/teams-hacktogether-idea/\"\u003eidea\u003c/a\u003e. This post will show you our \u003ca href=\"https://github.com/microsoft/hack-together-teams/issues/66\"\u003eentry\u003c/a\u003e.\u003c/p\u003e"},{"title":"Remove PowerShell modules by name","date_published":"2023-06-21T09:46:12Z","date_modified":"2023-06-21T09:46:12Z","id":"/2023/06/21/remove-powershell-modules-by-name/","url":"/2023/06/21/remove-powershell-modules-by-name/","tags":["MSGraph PowerShell","PowerShell"],"summary":"\u003cp\u003eLet\u0026rsquo;s say you installed a lot of PowerShell modules, and maybe several different versions. Cleaning this up or upgrading to the latest version is a terrible job.\u003c/p\u003e\n\u003cp\u003eLuckily you can use PowerShell to fix this for you.\u003c/p\u003e"},{"title":"Assign additional permissions to service principal","date_published":"2023-06-19T15:00:48Z","date_modified":"2023-06-19T15:00:48Z","id":"/2023/06/19/assign-additional-permissions-to-service-principal/","url":"/2023/06/19/assign-additional-permissions-to-service-principal/","tags":["Microsoft Graph","PowerShell","MSGraph PowerShell"],"summary":"\u003cp\u003eYou have a service principal in your tenant. Either you created it yourself or it\u0026rsquo;s a service principal for an app registration from another tenant (multi tenant application). Now this service principal needs access to an addition role. It\u0026rsquo;s not always possible to do a new admin consent sometimes you want the change just for a single service principal in a single tenant.\u003c/p\u003e\n\u003cp\u003eI \u003ca href=\"/2022/04/21/access-api-with-managed-identity/\"\u003ewrote\u003c/a\u003e about this before, but since the \u003cstrong\u003eAzure AD\u003c/strong\u003e module is depreciated, it\u0026rsquo;s time to do the same with the new \u003cstrong\u003eMicrosoft Graph PowerShell module\u003c/strong\u003e.\u003c/p\u003e"},{"title":"Teams Hacktogether: Blazor","date_published":"2023-06-14T10:46:41Z","date_modified":"2023-06-14T10:46:41Z","id":"/2023/06/14/teams-hacktogether-blazor/","url":"/2023/06/14/teams-hacktogether-blazor/","tags":["Microsoft Teams","Teams Hacktogether"],"summary":"\u003cp\u003eIn the previous post I shared my first experience with the \u003ca href=\"/2023/06/13/teams-hacktogether-toolkit/\"\u003eteams toolkit\u003c/a\u003e. For the \u003ca href=\"https://github.com/microsoft/hack-together-teams\"\u003eTeams Hacktogether\u003c/a\u003e, we started our Teams Tab in \u003ca href=\"https://dotnet.microsoft.com/en-us/apps/aspnet/web-apps/blazor\"\u003eBlazor\u003c/a\u003e. What is Blazor, what flavours are there and what about hosting your app?\u003c/p\u003e"},{"title":"Teams Hacktogether: Toolkit","date_published":"2023-06-13T09:12:39Z","date_modified":"2023-06-13T09:12:39Z","id":"/2023/06/13/teams-hacktogether-toolkit/","url":"/2023/06/13/teams-hacktogether-toolkit/","tags":["Microsoft Teams","Teams Hacktogether"],"summary":"\u003cp\u003eThere were some \u003ca href=\"/2023/06/12/teams-hacktogether-idea/#learning-new-stuff\"\u003eground rules\u003c/a\u003e for the \u003ca href=\"https://github.com/microsoft/hack-together-teams\"\u003eTeams Hacktogether\u003c/a\u003e, we were going to build our Teams tab in \u003ca href=\"https://dotnet.microsoft.com/en-us/apps/aspnet/web-apps/blazor\"\u003eBlazor\u003c/a\u003e. And this post describes the experience we had with the Visual Studio template for a Teams Tab in Blazor.\u003c/p\u003e"},{"title":"Teams Hacktogether: Getting access","date_published":"2023-06-12T12:30:21Z","date_modified":"2023-06-12T12:30:21Z","id":"/2023/06/12/teams-hacktogether-getting-access/","url":"/2023/06/12/teams-hacktogether-getting-access/","tags":["Microsoft Teams","Teams Hacktogether"],"summary":"\u003cp\u003eFor our \u003ca href=\"/2023/06/12/teams-hacktogether-idea/\"\u003eTeams app\u003c/a\u003e we wanted to access the applications from the \u003cstrong\u003eMy Apps\u003c/strong\u003e page, but how do you access data from an app that does not have a public api? Let me start by saying that accessing an internal api, like I\u0026rsquo;ll be showing is never recommended to use in production. Only use this information for proof-of-concepts, like what we are building.\u003c/p\u003e"},{"title":"Teams Hacktogether: Idea","date_published":"2023-06-12T12:30:21Z","date_modified":"2023-06-12T12:30:21Z","id":"/2023/06/12/teams-hacktogether-idea/","url":"/2023/06/12/teams-hacktogether-idea/","tags":["Microsoft Teams","Teams Hacktogether"],"summary":"\u003cp\u003eA few months ago, my friend \u003ca href=\"https://janbakker.tech/\"\u003eJan Bakker\u003c/a\u003e came to me, with a great idea. He had a client that asked \u0026ldquo;Can we show the applications from the \u003ca href=\"https://myapps.microsoft.com\"\u003eMy Apps\u003c/a\u003e page inside of Teams?\u0026rdquo; I thought this was an interesting idea, and checked the \u003ca href=\"https://learn.microsoft.com/graph/api/overview?view=graph-rest-1.0\u0026amp;preserve-view=true\u0026amp;wt.mc_id=SEC-MVP-5004985\"\u003edocumentation\u003c/a\u003e on the Microsoft Graph only to find out that you cannot easily access that information.\u003c/p\u003e"},{"title":"Nginx fault finding","date_published":"2023-03-30T00:00:00Z","date_modified":"2023-03-30T00:00:00Z","id":"/2023/03/30/nginx-errors/","url":"/2023/03/30/nginx-errors/","tags":["Nginx"],"summary":"\u003cp\u003eI had an issue with a NGINX server not starting after an upgrade, \u003ccode\u003esudo nginx -t\u003c/code\u003e did not help.\u003c/p\u003e"},{"title":"Betatalks, I was their guest","date_published":"2023-03-06T00:00:00Z","date_modified":"2023-03-06T00:00:00Z","id":"/2023/03/06/betatalks-podcast/","url":"/2023/03/06/betatalks-podcast/","tags":["Security","Home Automation"],"summary":"\u003cp\u003eI was asked to be a guest in \u003ca href=\"https://podcast.betatalks.nl/1622272/12352945-52-home-automation-and-security-done-right-and-wrong-with-stephan-van-rooij\"\u003eBetatalks the Podcast\u003c/a\u003e, and I like sharing knowledge on security and home automation, so I taught why not.\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"https://podcast.betatalks.nl/1622272/12352945-52-home-automation-and-security-done-right-and-wrong-with-stephan-van-rooij\"\u003e\u003cimg src=\"/assets/images/2023/03/betatalks-episode-52.png\" alt=\"Betatalks podcast banner\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eBeware, spoilers ahead. First listen to the episode then read this post.\u003c/p\u003e"},{"title":"Batching with Microsoft Graph","date_published":"2023-03-03T00:00:00Z","date_modified":"2023-03-03T00:00:00Z","id":"/2023/03/03/batching-in-microsoft-graph/","url":"/2023/03/03/batching-in-microsoft-graph/","tags":["Microsoft Graph","Batching"],"summary":"\u003cp\u003eMicrosoft has this great \u003ca href=\"https://learn.microsoft.com/en-us/graph/overview?wt.mc_id=SEC-MVP-5004985\"\u003eapi\u003c/a\u003e where you can control almost everything in the Microsoft 365 cloud. To speed up your requests, you can combine up to \u003ca href=\"#need-link\"\u003e20\u003c/a\u003e requests in a \u003ca href=\"https://learn.microsoft.com/en-us/graph/json-batching?wt.mc_id=SEC-MVP-5004985\"\u003ebatch\u003c/a\u003e. This post will explain how to use batching and how it got implemented in the \u003ca href=\"https://github.com/microsoftgraph/msgraph-sdk-dotnet-core?wt.mc_id=SEC-MVP-5004985\"\u003eGraph SDK for DOTNET\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003e\u003cimg src=\"/assets/images/2023/03/batch-add-users-to-group.png\" alt=\"Add users to group fast\"\u003e\u003c/p\u003e"},{"title":"I disconnected our smart oven, and maybe you should as well","date_published":"2023-01-25T00:00:00Z","date_modified":"2023-01-25T00:00:00Z","id":"/2023/01/25/disconnect-your-smart-appliance/","url":"/2023/01/25/disconnect-your-smart-appliance/","tags":["Home Automation","Smart Appliance","Optional cloud"],"summary":"\u003cp\u003e\u003cstrong\u003eArstechnica\u003c/strong\u003e published an \u003ca href=\"https://arstechnica.com/gadgets/2023/01/half-of-smart-appliances-remain-disconnected-from-internet-makers-lament/\"\u003earticle\u003c/a\u003e yesterday, called \u003cstrong\u003e\u0026ldquo;Appliance makers sad that 50% of customers won’t connect smart appliances\u0026rdquo;\u003c/strong\u003e. Let me tell you, I\u0026rsquo;m glad people don\u0026rsquo;t connect their oven to the internet. We own two of these smart appliances from AEG and I disconnected them as soon as I discovered what they do.\u003c/p\u003e\n\u003cp\u003e\u003cimg src=\"/assets/images/2023/01/ping-aeg.png\" alt=\"Pinging aeg\"\u003e\u003c/p\u003e"},{"title":"Creating a Home Assistant component","date_published":"2023-01-18T00:00:00Z","date_modified":"2023-01-18T00:00:00Z","id":"/2023/01/18/home-assistant-component/","url":"/2023/01/18/home-assistant-component/","tags":["Home Assistant"],"summary":"\u003cp\u003eHome automation is a topic that speaks to the imagination for most of us. Rooms that light up if you enter them, a notification on your phone when someone rings the doorbell. These thing tickled my personal interest years ago. Back then nobody was doing these kinds of things and as a developer I was intrigued.\u003c/p\u003e\n\u003cp\u003eIf you talk about Home Automation in 2023 you\u0026rsquo;re probably also talking about \u003ca href=\"https://www.home-assistant.io\"\u003eHome Assistant\u003c/a\u003e, if you\u0026rsquo;ve never heard about that. Go on check their website, it\u0026rsquo;s awesome. Open-source mostly \u003cstrong\u003elocal\u003c/strong\u003e home automation with, \u0026ldquo;components\u0026rdquo; or \u0026ldquo;integrations\u0026rdquo; (they mix these terms, don\u0026rsquo;t know why) for thousands of devices. Out-of-the-box you have support for a lot of devices, but because it\u0026rsquo;s open-source you can easily add your own custom components. Home Assistant started as an applciation you would run on a simple raspberry pi you had laying around, recently more and more people are switching to a slightly more powerful system because the pi is no longer sufficient for their needs.\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"https://www.linkedin.com/in/stephanvanrooij\"\u003e\u003cimg src=\"https://img.shields.io/badge/LinkedIn-stephanvanrooij-blue?style=for-the-badge\u0026amp;logo=linkedin\" alt=\"LinkedIn Profile\"\u003e\u003c/a\u003e\n\u003ca href=\"https://twitter.com/svrooij\"\u003e\u003cimg src=\"https://img.shields.io/twitter/follow/svrooij?logo=twitter\u0026amp;style=for-the-badge\u0026amp;logoColor=white\" alt=\"Twitter follow\"\u003e\u003c/a\u003e\n\u003ca href=\"https://dotnet.social/@svrooij\"\u003e\u003cimg src=\"https://img.shields.io/mastodon/follow/109502876771613420?domain=https%3A%2F%2Fdotnet.social\u0026amp;label=%40svrooij%40dotnet.social\u0026amp;logo=mastodon\u0026amp;logoColor=white\u0026amp;style=for-the-badge\" alt=\"Link Mastodon\"\u003e\u003c/a\u003e\n\u003ca href=\"https://svrooij.io/\"\u003e\u003cimg src=\"https://img.shields.io/badge/blog-svrooij.io-blue?style=for-the-badge\" alt=\"Blog\"\u003e\u003c/a\u003e\u003c/p\u003e"},{"title":"Extract all users with powershell and what to do about it part two","date_published":"2023-01-16T00:00:00Z","date_modified":"2023-01-16T00:00:00Z","id":"/2023/01/16/extract-all-users-with-powershell-part-two/","url":"/2023/01/16/extract-all-users-with-powershell-part-two/","tags":["Data Extraction","Microsoft Graph","PowerShell"],"summary":"\u003cp\u003eIn a \u003ca href=\"/2022/05/16/extract-all-users-with-powershell/\"\u003eprevious post\u003c/a\u003e I showed how to extract all users from a Microsoft 365 tenant, and what you should do about that. If you followed along that leak got restricted. The Azure AD module isn\u0026rsquo;t the only way to extract user information from a tenant. This post will show you how to do the same (extract all users to csv file) with the Graph PowerShell modules and what you should do about that.\u003c/p\u003e"},{"title":"An introduction to cmd.ms","date_published":"2023-01-11T00:00:00Z","date_modified":"2023-01-11T00:00:00Z","id":"/2023/01/11/cmd-ms/","url":"/2023/01/11/cmd-ms/","tags":["Microsoft365"],"summary":"\u003cp\u003eDevelopers and admins love to open apps using their keyboard, with all kinds of shortcuts. \u003ca href=\"https://github.com/merill\"\u003eMerill Fernando\u003c/a\u003e made something really usefull called \u003ccode\u003ecmd.ms\u003c/code\u003e. Continue reading to see what it is and how you can use it yourself.\u003c/p\u003e\n\u003cp\u003e\u003cimg src=\"/assets/images/2023/01/cmd_ms_home.png\" alt=\"CMD.ms screenshot\"\u003e\u003c/p\u003e"},{"title":"2022: An exciting year","date_published":"2023-01-02T00:00:00Z","date_modified":"2023-01-02T00:00:00Z","id":"/2023/01/02/this-was-2022/","url":"/2023/01/02/this-was-2022/","tags":["Year review"],"summary":"\u003cp\u003ePrevious year was quite exciting, a lot has happened. In this post I look back on my most popular posts in 2022 and some of the open-source projects I enjoyed building.\u003c/p\u003e"},{"title":"Every project needs a badge","date_published":"2023-01-02T00:00:00Z","date_modified":"2023-01-02T00:00:00Z","id":"/2023/01/02/badges-badges-badges/","url":"/2023/01/02/badges-badges-badges/","tags":["Badges"],"summary":"\u003cp\u003eYou just created a new open-source project. Great, you rock! A lot of repositories have these nice images showing dynamic details of the repository. How does that work? By using these dynamic badges you can really make your repository stand out.\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"https://www.linkedin.com/in/stephanvanrooij\"\u003e\u003cimg src=\"https://img.shields.io/badge/LinkedIn-stephanvanrooij-blue?style=for-the-badge\u0026amp;logo=linkedin\" alt=\"LinkedIn Profile\"\u003e\u003c/a\u003e\n\u003ca href=\"https://twitter.com/svrooij\"\u003e\u003cimg src=\"https://img.shields.io/twitter/follow/svrooij?logo=twitter\u0026amp;style=for-the-badge\u0026amp;logoColor=white\" alt=\"Twitter follow\"\u003e\u003c/a\u003e\n\u003ca href=\"https://dotnet.social/@svrooij\"\u003e\u003cimg src=\"https://img.shields.io/mastodon/follow/109502876771613420?domain=https%3A%2F%2Fdotnet.social\u0026amp;label=%40svrooij%40dotnet.social\u0026amp;logo=mastodon\u0026amp;logoColor=white\u0026amp;style=for-the-badge\" alt=\"Link Mastodon\"\u003e\u003c/a\u003e\n\u003ca href=\"https://svrooij.io/\"\u003e\u003cimg src=\"https://img.shields.io/badge/blog-svrooij.io-blue?style=for-the-badge\" alt=\"Blog\"\u003e\u003c/a\u003e\u003c/p\u003e"},{"title":"Proof of concept: Multi tenant managed identity","date_published":"2022-12-16T00:00:00Z","date_modified":"2022-12-16T00:00:00Z","id":"/2022/12/16/poc-multi-tenant-managed-identity/","url":"/2022/12/16/poc-multi-tenant-managed-identity/","tags":["Azure AD","Managed Identity","Federated Credentials"],"summary":"\u003cp\u003eEver since Microsoft created \u003ca href=\"https://docs.microsoft.com/en-us/azure/active-directory/managed-identities-azure-resources/overview?wt.mc_id=SEC-MVP-5004985\"\u003emanaged identities\u003c/a\u003e, people are asking how/if they work for multi-tenant applications. They even spend a \u003ca href=\"https://docs.microsoft.com/en-us/azure/active-directory/managed-identities-azure-resources/managed-identities-faq?wt.mc_id=SEC-MVP-5004985#can-i-use-a-managed-identity-to-access-a-resource-in-a-different-directorytenant\"\u003efaq\u003c/a\u003e on it.\u003c/p\u003e\n\u003cp\u003eIn my \u003ca href=\"https://svrooij.io/2022/06/21/managed-identity-multi-tenant-app/\"\u003eprevious post\u003c/a\u003e I wrote that it was possible to use a managed identity to get access tokens for some multi tenant application, if you haven\u0026rsquo;t seen that post be sure to check it out since this post uses the knowlage from that post to demo the process.\u003c/p\u003e"},{"title":"Hacking Primary refresh tokens, oops created a virus","date_published":"2022-10-18T00:00:00Z","date_modified":"2022-10-18T00:00:00Z","id":"/2022/10/18/hacking-prt/","url":"/2022/10/18/hacking-prt/","tags":["Azure AD","Security","Research"],"summary":"\u003cp\u003eWindows has some cleaver ways to handle SSO in combination with Azure AD. They use this so called \u003ca href=\"https://learn.microsoft.com/en-us/azure/active-directory/devices/concept-primary-refresh-token?wt.mc_id=SEC-MVP-5004985\"\u003ePrimary Refresh Token\u003c/a\u003e. These highly sensitive key materials, are usually stored in the systems TPM (trusted platform module), a hardware device that can protect keys. And are \u0026ldquo;unlocked\u0026rdquo; when the user logs in.\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"https://posts.specterops.io/requesting-azure-ad-request-tokens-on-azure-ad-joined-machines-for-browser-sso-2b0409caad30\"\u003eA post\u003c/a\u003e, by \u003ca href=\"https://twitter.com/tifkin_\"\u003eLee Christensen\u003c/a\u003e and the accompanying \u003ca href=\"https://github.com/leechristensen/RequestAADRefreshToken\"\u003eRequestAADRefreshToken source\u003c/a\u003e, inspired me to check out what he had found.\u003c/p\u003e"},{"title":"Cancellable task with timeout","date_published":"2022-10-04T00:00:00Z","date_modified":"2022-10-04T00:00:00Z","id":"/2022/10/04/cancellable-task-with-timeout/","url":"/2022/10/04/cancellable-task-with-timeout/","tags":["Code snippet","C#"],"summary":"\u003cp\u003eDon\u0026rsquo;t you like the \u003ccode\u003easync\u003c/code\u003e and \u003ccode\u003eawait\u003c/code\u003e way of asynchronously programming in C#? I can tell you I like them a lot. Recently I came across a case where I wanted to add a timeout to an asynchronous task.\u003c/p\u003e"},{"title":"Create Outlook category for everyone","date_published":"2022-09-27T00:00:00Z","date_modified":"2022-09-27T00:00:00Z","id":"/2022/09/27/create-corporate-outlook-category/","url":"/2022/09/27/create-corporate-outlook-category/","tags":["Outlook","Administration","PowerShell","MSGraph PowerShell"],"summary":"\u003cp\u003eDid you know you can categorize items in your Outlook calendar to give them a different color (in most official Outlook clients)? You can help your users by pre-configuring some default categories. You can also create categories for your users if you have some automation to create items in their calendar by some automated way.\u003c/p\u003e"},{"title":"Protect against SSO for Graph PowerShell","date_published":"2022-09-14T00:00:00Z","date_modified":"2022-09-14T00:00:00Z","id":"/2022/09/14/protect-against-sso-graph-powershell/","url":"/2022/09/14/protect-against-sso-graph-powershell/","tags":["Administration","PowerShell","MSGraph PowerShell"],"summary":"\u003cp\u003eWhy would you want to disable SSO for some cloud app, we love SSO, it makes our life easier? I agree, single-sign-on is great, until it is used without the knowledge of a user that logged-in with his admin account (don\u0026rsquo;t do that!).\u003c/p\u003e"},{"title":"Replace an owner in all their Teams","date_published":"2022-09-13T00:00:00Z","date_modified":"2022-09-13T00:00:00Z","id":"/2022/09/13/replace-teams-owner/","url":"/2022/09/13/replace-teams-owner/","tags":["Microsoft Teams","Administration","PowerShell","MSGraph PowerShell"],"summary":"\u003cp\u003eMicrosoft Teams without an owner are no longer manageable, so what happens if some user leaves the company and he/she was an owner in several Teams?\u003c/p\u003e"},{"title":"Externalize user accounts: OpenID Connect","date_published":"2022-08-05T00:00:00Z","date_modified":"2022-08-05T00:00:00Z","id":"/2022/08/05/externalize-user-acconts-openid-connect/","url":"/2022/08/05/externalize-user-acconts-openid-connect/","tags":["OpenID Connect","Security","Microservice","Externalize Users"],"summary":"\u003cp\u003eExternalizing user accounts, what is he thinking? The \u003ca href=\"/2022/07/28/externalize-user-acconts-intro/\"\u003eprevious post\u003c/a\u003e should give you a clear view what this means and why you should consider it. This post will go a into details of \u0026ldquo;delegating login\u0026rdquo; to a separate application.\u003c/p\u003e"},{"title":"Externalize user accounts: An introduction","date_published":"2022-07-28T00:00:00Z","date_modified":"2022-07-28T00:00:00Z","id":"/2022/07/28/externalize-user-accounts-intro/","url":"/2022/07/28/externalize-user-accounts-intro/","tags":["OpenID Connect","Security","Microservice","Externalize Users"],"summary":"\u003cp\u003eExternalizing user accounts, what is he thinking? In this post I\u0026rsquo;ll explain why every company should consider externalizing their user account management from their applications.\u003c/p\u003e"},{"title":"Using a managed identity as a client credential","date_published":"2022-06-21T00:00:00Z","date_modified":"2022-06-21T00:00:00Z","id":"/2022/06/21/managed-identity-multi-tenant-app/","url":"/2022/06/21/managed-identity-multi-tenant-app/","tags":["Azure AD","Managed Identity","Federated Credentials"],"summary":"\u003cp\u003eEver since Microsoft created \u003ca href=\"https://docs.microsoft.com/en-us/azure/active-directory/managed-identities-azure-resources/overview?wt.mc_id=SEC-MVP-5004985\"\u003emanaged identities\u003c/a\u003e, people are asking how/if they work for multi-tenant applications. They even spend a \u003ca href=\"https://docs.microsoft.com/en-us/azure/active-directory/managed-identities-azure-resources/managed-identities-faq?wt.mc_id=SEC-MVP-5004985#can-i-use-a-managed-identity-to-access-a-resource-in-a-different-directorytenant\"\u003efaq\u003c/a\u003e on it.\u003c/p\u003e\n\u003cp\u003ePreviously you had to go through \u003ca href=\"/2022/01/20/secure-multi-tenant-app/\"\u003esome hoops\u003c/a\u003e to use managed identities with your multi tenant app.\u003c/p\u003e\n\u003cp\u003eLet\u0026rsquo;s have a look if we can solve this with in combination with \u003ca href=\"/2022/06/20/federated-credentials/\"\u003efederated credentials\u003c/a\u003e.\u003c/p\u003e"},{"title":"Federated credentials, wait what?","date_published":"2022-06-20T00:00:00Z","date_modified":"2022-06-20T00:00:00Z","id":"/2022/06/20/federated-credentials/","url":"/2022/06/20/federated-credentials/","tags":["Azure AD","Identities","Secrets","Federated Credentials"],"summary":"\u003cp\u003eWorkflow identity federation of \u0026ldquo;federated credentials\u0026rdquo; as they are called in the Azure Portal are brand new in the Microsoft identity suite. As of writing they are still in preview.\u003c/p\u003e\n\u003cp\u003eWhat are they and how does it work? This will all be explained in the post below.\u003c/p\u003e\n\u003cp\u003e\u003cimg src=\"/assets/images/2022/06/federated-credentials.png\" alt=\"federated credentials on Azure portal\"\u003e\u003c/p\u003e"},{"title":"Building a GitHub Action in .NET","date_published":"2022-06-09T00:00:00Z","date_modified":"2022-06-09T00:00:00Z","id":"/2022/06/09/building-github-action-in-net/","url":"/2022/06/09/building-github-action-in-net/","tags":["GitHub","CI",".NET"],"summary":"\u003cp\u003eGitHub Actions allow you to run some program every time an event (or trigger) happens in GitHub. You can respond to a new PR, a new issue or even periodically run some job. There are \u003ca href=\"https://github.com/marketplace?type=actions\"\u003ethousands\u003c/a\u003e of little actions you can use in your own workflow.\u003c/p\u003e\n\u003cp\u003e\u003cimg src=\"/assets/images/github-actions-banner.png\" alt=\"undraw image\"\u003e\u003c/p\u003e"},{"title":"Protect against certificate extraction - encryption","date_published":"2022-06-01T00:00:00Z","date_modified":"2022-06-01T00:00:00Z","id":"/2022/06/01/certificate-extraction-encryption/","url":"/2022/06/01/certificate-extraction-encryption/","tags":["Security","Encryption"],"summary":"\u003cp\u003eYou\u0026rsquo;re encrypting sensitive data with RSA encryption, great start! But how do you protect your certificates from being extracted? You get hacked and they steal your encrypted data, no problem, it\u0026rsquo;s encrypted! If they hack you, are you sure they can\u0026rsquo;t also steal the certificate? This series covers several risks of \u003cstrong\u003eCertificate Extraction\u003c/strong\u003e and what you can do about it.\u003c/p\u003e\n\u003cp\u003e\u003cimg src=\"/assets/images/undraw_Security_on_re_e491.png\" alt=\"undraw image\"\u003e\u003c/p\u003e"},{"title":"Protect against certificate extraction - Client credentials","date_published":"2022-05-27T00:00:00Z","date_modified":"2022-05-27T00:00:00Z","id":"/2022/05/27/certificate-extraction-client-credentials/","url":"/2022/05/27/certificate-extraction-client-credentials/","tags":["Security","Azure AD"],"summary":"\u003cp\u003eYou have this multi-tenant application that is protected with Azure AD, great! How about the certificate you\u0026rsquo;re using as a client credential? If you followed the Microsoft samples it\u0026rsquo;s probably stored in the Azure Key Vault. This seems really secure, but there is one thing no one thought about \u003cstrong\u003eCertificate Extraction\u003c/strong\u003e.\u003c/p\u003e\n\u003cp\u003e\u003cimg src=\"/assets/images/undraw_Safe_re_kiil.png\" alt=\"undraw image\"\u003e\u003c/p\u003e"},{"title":"Extract all Azure AD admin accounts","date_published":"2022-05-17T00:00:00Z","date_modified":"2022-05-17T00:00:00Z","id":"/2022/05/17/extract-azure-admins/","url":"/2022/05/17/extract-azure-admins/","tags":["Azure AD","Data Extraction","PowerShell"],"summary":"\u003cp\u003ePowershell is pretty powerful for all kind of administrative tasks, especially if you load some extra modules. We use the \u003ca href=\"https://docs.microsoft.com/en-us/powershell/module/azuread/?wt.mc_id=SEC-MVP-5004985\"\u003eAzureAD\u003c/a\u003e module for a lot of tasks that can be (semi-)automated with the use of some script. In \u003ca href=\"/2022/05/16/extract-all-users-with-powershell/\"\u003ethis post\u003c/a\u003e I described how to extract all users from Azure AD as a regular user, and what you should do about it.\u003c/p\u003e\n\u003cp\u003eExtracting users isn\u0026rsquo;t the only thing you can do with Azure AD powershell and this page shows how to export all Azure AD global admins (which can be executed by \u003cstrong\u003eANY\u003c/strong\u003e user in your tenant unless you \u003ca href=\"/2022/05/16/extract-all-users-with-powershell/#block-azuread-module-with-powershell\"\u003etake action\u003c/a\u003e against that.)\u003c/p\u003e"},{"title":"Extract all users with powershell and what you should do about it","date_published":"2022-05-16T00:00:00Z","date_modified":"2022-05-16T00:00:00Z","id":"/2022/05/16/extract-all-users-with-powershell/","url":"/2022/05/16/extract-all-users-with-powershell/","tags":["Azure AD","Data Extraction","PowerShell"],"summary":"\u003cp\u003ePowershell is pretty powerful for all kind of administrative tasks, especially if you load some extra modules. We use the \u003ca href=\"https://docs.microsoft.com/en-us/powershell/module/azuread/?wt.mc_id=SEC-MVP-5004985\"\u003eAzureAD\u003c/a\u003e module for a lot of tasks that can be (semi-)automated with the use of some script.\u003c/p\u003e"},{"title":"Deploy to Azure Static Web App with only the name","date_published":"2022-05-05T00:00:00Z","date_modified":"2022-05-05T00:00:00Z","id":"/2022/05/05/deploy-static-web-app-without-token/","url":"/2022/05/05/deploy-static-web-app-without-token/","tags":["Static Web App","Azure CLI"],"summary":"\u003cp\u003eEver heard of \u003ca href=\"https://azure.microsoft.com/en-us/services/app-service/static/\"\u003eAzure Static Web Apps\u003c/a\u003e? It combines a single page app (Angular/React/?) with Azure Functions, and manages it all for you.\u003c/p\u003e\n\u003cp\u003eThe deployment is a breeze, as long as you have the \u003cstrong\u003edeployment token\u003c/strong\u003e available to your build pipeline. The deployment token should be kept a secret and you should save it somewhere secure.\u003c/p\u003e"},{"title":"Access Azure AD protected API with managed Identity","date_published":"2022-04-21T00:00:00Z","date_modified":"2022-04-21T00:00:00Z","id":"/2022/04/21/access-api-with-managed-identity/","url":"/2022/04/21/access-api-with-managed-identity/","tags":["Graph API","Azure AD","Managed Identity"],"summary":"\u003cp\u003e\u003ca href=\"https://docs.microsoft.com/en-us/azure/active-directory/managed-identities-azure-resources/overview?wt.mc_id=SEC-MVP-5004985\"\u003eManaged identities\u003c/a\u003e are a great way to improve the security of your application.\nMicrosoft \u0026ldquo;manages\u0026rdquo; the rotation of secrets and makes sure they cannot be extracted or used anywhere outside their platform.\nThat is the reason I\u0026rsquo;m a big fan off Managed Identities!\u003c/p\u003e\n\u003cp\u003eYou should use managed identities wherever possible. It\u0026rsquo;s possible to use managed identities for accessing (custom) api\u0026rsquo;s, an that is exactly what I\u0026rsquo;ll be explaining in this post. At the and you will be able to call any Azure AD protected api with using a managed identity.\u003c/p\u003e"},{"title":"UPDATE: Elektrische steps in Nederland","date_published":"2022-03-30T00:00:00Z","date_modified":"2022-03-30T00:00:00Z","id":"/2022/03/30/step-met-ondersteuning/","url":"/2022/03/30/step-met-ondersteuning/","tags":["Rijksoverheid","Elektrische step"],"summary":"\u003cp\u003eNederland roept al jaren dat het technologisch voor wil lopen op de rest. We hebben enorm veel dingen uitgevonden in Nederland, Videobanden, bluetooth, enzovoort. Maar op het gebied van vervoersmiddelen lopen we echt enorm achter. In heel Europa zie je overal elektrische steps, in mijn ogen een super goede manier om mensen uit hun auto te krijgen.\u003c/p\u003e\n\u003cp\u003e\u003cimg src=\"/assets/images/2022/03/e-step-verboden.png\" alt=\"Elektrische step\u0026hellip; levensgevaarlijk\u0026hellip;\"\u003e\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eUpdate\u003c/strong\u003e Deze pagina sprak over een pagina die is verwijderd van \u003ccode\u003erijksoverheid.nl\u003c/code\u003e, dat is inmiddels rechtgezet zie \u003ca href=\"#update-wob-verzoek\"\u003eupdate WOB Verzoek\u003c/a\u003e.\u003c/p\u003e"},{"title":"Open-source sonos apps","date_published":"2022-03-06T00:00:00Z","date_modified":"2022-03-06T00:00:00Z","id":"/2022/03/06/sonos-apps/","url":"/2022/03/06/sonos-apps/","tags":["Sonos","Open source"],"summary":"\u003cp\u003eOut of personal interest I\u0026rsquo;ve build several apps to have better control your Sonos speakers. This page will give you a brief overview of these apps.\u003c/p\u003e"},{"title":"KeyVault proxy demo","date_published":"2022-03-03T00:00:00Z","date_modified":"2022-03-03T00:00:00Z","id":"/2022/03/03/keyvault-proxy/","url":"/2022/03/03/keyvault-proxy/","tags":["Azure AD","Client credentials","Dotnet tool"],"summary":"\u003cp\u003eToday I\u0026rsquo;ll demo my new \u003ca href=\"https://svrooij.io/2022/02/04/token-proxy/\"\u003eKeyVault proxy\u003c/a\u003e in the \u003ca href=\"https://www.twitch.tv/425show\"\u003e425show\u003c/a\u003e.\nThis page will allow you to follow along.\u003c/p\u003e\n\u003cp\u003eCheck out the \u003ca href=\"https://www.twitch.tv/videos/1414084395\"\u003erecording\u003c/a\u003e and if you have any questions, contact me on \u003ca href=\"https://twitter.com/svrooij\"\u003etwitter @svrooij\u003c/a\u003e.\u003c/p\u003e"},{"title":"Clean developer install - Winget","date_published":"2022-02-18T00:00:00Z","date_modified":"2022-02-18T00:00:00Z","id":"/2022/02/18/winget/","url":"/2022/02/18/winget/","tags":["Developer","Workstation","Clean install"],"summary":"\u003cp\u003eA clean windows installation just feels faster, and as a developer I want a \u003cstrong\u003efast\u003c/strong\u003e machine! Why don\u0026rsquo;t you just reinstall your machine once a month, you ask? Because it takes a lot of time to set it up just right.\u003c/p\u003e"},{"title":"Introducing OBS Clock","date_published":"2022-02-15T00:00:00Z","date_modified":"2022-02-15T00:00:00Z","id":"/2022/02/15/obs-clock/","url":"/2022/02/15/obs-clock/","tags":["OBS","Overlay"],"summary":"\u003cp\u003eI like to make my Team meetings a little more interactive, so I use \u003ca href=\"https://obsproject.com/\"\u003eOBS\u003c/a\u003e to make my webcam look more awesome. I\u0026rsquo;ve setup hosting for some javascript clock I found on the web somewhere.\u003c/p\u003e"},{"title":"Securing credentials during development","date_published":"2022-02-04T00:00:00Z","date_modified":"2022-02-04T00:00:00Z","id":"/2022/02/04/token-proxy/","url":"/2022/02/04/token-proxy/","tags":["Azure","Azure AD","Client credentials","Dotnet tool"],"summary":"\u003cp\u003eProtecting client credentials for (multi-tenant) application should be your highest priority, not only in \u003cstrong\u003eproduction\u003c/strong\u003e also during \u003cstrong\u003edevelopment\u003c/strong\u003e.\u003c/p\u003e\n\u003cp\u003eWe developed a small application that helps you do just that.\nUse your Visual Studio credentials to sign a token request while the certificate stays in the KeyVault.\nYou could even only authorize developers to use the certificates in a KeyVault when they need it and de-authorize then when it\u0026rsquo;s no longer needed.\u003c/p\u003e"},{"title":"Jekyll website to progressive web app","date_published":"2022-01-29T00:00:00Z","date_modified":"2022-01-29T00:00:00Z","id":"/2022/01/29/jekyll-pwa/","url":"/2022/01/29/jekyll-pwa/","tags":["Jekyll","PWA","Service worker"],"summary":"\u003cp\u003eA PWA (or Progressive web application) is a website which can be installed on a desktop and acts like an app. It has an icon and a title. And it can even receive messages from the server if the app isn\u0026rsquo;t running. It can also show notification messages to the users.\u003c/p\u003e\n\u003cp\u003eSo in short it\u0026rsquo;s a website acting like an app. This post shows you how to turn a Github Pages website into a pwa in three easy steps.\u003c/p\u003e"},{"title":"Twitter cards for static web page","date_published":"2022-01-21T00:00:00Z","date_modified":"2022-01-21T00:00:00Z","id":"/2022/01/21/twitter-cards/","url":"/2022/01/21/twitter-cards/","tags":["Twitter","Content","Jekyll"],"summary":"\u003cp\u003eMy personal page is a static website hosted on \u003ca href=\"https://pages.github.com/\"\u003eGithub pages\u003c/a\u003e. Posts are written in \u003ca href=\"https://en.wikipedia.org/wiki/Markdown\"\u003emarkdown\u003c/a\u003e and the source of all the posts is in my \u003ca href=\"https://github.com/svrooij/svrooij.github.io/tree/master/_posts\"\u003epublic repository\u003c/a\u003e. I tweet about most posts at least once, and it just shows the link, that\u0026rsquo;s not what I want.\u003c/p\u003e\n\u003cp\u003eAll tweets to my blog should at least show the title and a short description. Maybe even a large image related to the post.\u003c/p\u003e"},{"title":"Securing multi-tenant app with Managed Identity","date_published":"2022-01-20T00:00:00Z","date_modified":"2022-01-20T00:00:00Z","id":"/2022/01/20/secure-multi-tenant-app/","url":"/2022/01/20/secure-multi-tenant-app/","tags":["MSAL","Multi tenant","Security"],"summary":"\u003cp\u003eKeeping your secrets secure, can be a huge challenge. And keeping secrets becomes a huge responsibility, especially if you\u0026rsquo;re in the business of building multi-tenant applications. Microsoft created managed identities to ease this responsibility, but \u003ca href=\"https://docs.microsoft.com/en-us/azure/active-directory/managed-identities-azure-resources/managed-identities-faq?wt.mc_id=SEC-MVP-5004985#can-i-use-a-managed-identity-to-access-a-resource-in-a-different-directorytenant\"\u003eaccording to the faq\u003c/a\u003e, you cannot use them to secure resources in other tenants. And that is exactly where we could use extra help is securing secrets.\u003c/p\u003e"},{"title":"Clone a BIG git repository","date_published":"2022-01-19T00:00:00Z","date_modified":"2022-01-19T00:00:00Z","id":"/2022/01/19/clone-big-repository/","url":"/2022/01/19/clone-big-repository/","tags":["GitHub"],"summary":"\u003cp\u003eWanted to clone a repository to do a quick text fix and create a pull request. Created the \u003ca href=\"https://github.com/svrooij/azure-docs\"\u003efork\u003c/a\u003e, and tried to clone.\nCloning the repository took way longer than I\u0026rsquo;m used to.\u003c/p\u003e\n\u003cp\u003e\u003cimg src=\"/assets/images/2022/01/slow-git-clone.png\" alt=\"Slow git clone\"\u003e\u003c/p\u003e"},{"title":"Github Actions: Use secret file","date_published":"2021-08-17T00:00:00Z","date_modified":"2021-08-17T00:00:00Z","id":"/2021/08/17/github-actions-secret-file/","url":"/2021/08/17/github-actions-secret-file/","tags":["CI","Github Actions","PowerShell","Secrets"],"summary":"\u003cp\u003e\u003ca href=\"https://github.com/features/actions\"\u003eGithub Actions\u003c/a\u003e are great for automating tests and builds, among other things. If you need a secret (key/token/password), you can add those in the configuration and use them in your workflow.\u003c/p\u003e\n\u003cp\u003eSometimes you need a file that is meant to be secret inside your workflow. This post shows you how to securely save this file as a secret and recreate the file during build. We use base64 encoding for a way to convert any file to a string that can be saved in the secrets.\u003c/p\u003e\n\u003cp\u003eThis is all done in powershell core, which is available in all (Windows/Mac/Linux) runners on Github. The code below should work on any platform, but is only tested on a \u003ccode\u003ewindows-latest\u003c/code\u003e runner.\u003c/p\u003e"},{"title":"Using Managed Identity without Azure","date_published":"2021-07-20T00:00:00Z","date_modified":"2021-07-20T00:00:00Z","id":"/2021/07/20/managed-identity-without-azure/","url":"/2021/07/20/managed-identity-without-azure/","tags":["Azure","Managed Identity"],"summary":"\u003cp\u003eAzure \u003ca href=\"https://docs.microsoft.com/en-us/azure/active-directory/managed-identities-azure-resources/overview?wt.mc_id=SEC-MVP-5004985\"\u003emanaged identities\u003c/a\u003e are great. You just turn it on and your Azure Resource can request a token for other resources that support it in your tenant. This way each resource in Azure can get it\u0026rsquo;s own \u0026ldquo;identity\u0026rdquo; and Microsoft will manage the credentials for you. You\u0026rsquo;ll no longer have to store credentials in the configuration as this is all part of the managed services.\u003c/p\u003e\n\u003cp\u003eThis post will give you an in-depth view of how Azure allows several client apps to requests tokens for Azure Resources.\u003c/p\u003e"},{"title":"Home automation setup","date_published":"2021-06-09T00:00:00Z","date_modified":"2021-06-09T00:00:00Z","id":"/2021/06/09/home-automation-setup/","url":"/2021/06/09/home-automation-setup/","tags":["Home Automation","mqtt"],"summary":"\u003cp\u003eI\u0026rsquo;m big fan of smart homes, almost everything in our home is controlable over the network. And I\u0026rsquo;ve build \u003ca href=\"#my-smarthome-apps\"\u003esome awesome apps\u003c/a\u003e for it. This post will describe all the components used in my home, and how they connect to each other.\u003c/p\u003e"},{"title":"Azure Functions with multi tenant authentication","date_published":"2021-05-05T00:00:00Z","date_modified":"2021-05-05T00:00:00Z","id":"/2021/05/05/azure-functions-multi-tenant-authentication/","url":"/2021/05/05/azure-functions-multi-tenant-authentication/","tags":["Azure Functions","Authentication","Multi tenant"],"summary":"\u003cp\u003eAzure Functions (and Azure App Service) support authentication out of the box. They even made a wizard to get you started quickly. This is really useful if you just want users from your tenant (or a specific other tenant) to login.\u003c/p\u003e\n\u003cp\u003eCheck-out the \u003ca href=\"https://docs.microsoft.com/en-us/azure/app-service/overview-authentication-authorization?wt.mc_id=SEC-MVP-5004985\"\u003edocumentation\u003c/a\u003e to get started.\u003c/p\u003e"},{"title":"Azure Functions restore app settings","date_published":"2021-04-28T00:00:00Z","date_modified":"2021-04-28T00:00:00Z","id":"/2021/04/28/azure-functions-restore-appsettings/","url":"/2021/04/28/azure-functions-restore-appsettings/","tags":["Azure Functions","App settings"],"summary":"\u003cp\u003eAzure Functions share a lot with ASP.NET core, but some really useful things aren\u0026rsquo;t supported by default. I was missing the \u003ca href=\"https://docs.microsoft.com/en-us/aspnet/core/fundamentals/configuration/?wt.mc_id=SEC-MVP-5004985\"\u003econfiguration stuff\u003c/a\u003e when building an Azure Functions app.\u003c/p\u003e"},{"title":"Generate awesome flows in markdown","date_published":"2021-04-01T00:00:00Z","date_modified":"2021-04-01T00:00:00Z","id":"/2021/04/01/generate-flows-from-markdown/","url":"/2021/04/01/generate-flows-from-markdown/","tags":["Flows","Markdown","Charts","Mermaid"],"summary":"\u003cp\u003eFlow diagrams can help greatly to explain some flow, it works much better the just text. To generate visual flows from text (markdown), \u003ca href=\"https://github.com/knsv\"\u003eKnut Sveidqvist\u003c/a\u003e created \u003ca href=\"https://mermaid-js.github.io/mermaid/#/\"\u003eMermaid-js\u003c/a\u003e. It\u0026rsquo;s awesome, go check out the docs.\u003c/p\u003e"},{"title":"Schijnveiligheid van Marktplaats gelijk oversteken service","date_published":"2021-04-01T00:00:00Z","date_modified":"2021-04-01T00:00:00Z","id":"/2021/04/01/schijnveiligheid-van-gelijk-oversteken/","url":"/2021/04/01/schijnveiligheid-van-gelijk-oversteken/","tags":["Marktplaats","Oplichting","Waarschuwing"],"summary":"\u003cp\u003eMarktplaats is in Nederland \u003cstrong\u003ede\u003c/strong\u003e website voor tweedehands spullen (als ik \u003ca href=\"https://www.alexa.com/topsites/countries/NL\"\u003eAlexa ranking\u003c/a\u003e moet geloven). Hier worden jaarlijks vele dingen verhandeld en weggegeven.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eUPDATE 13-04-2022\u003c/strong\u003e deze pagina ging over hoe slecht de gelijkoversteken service van Marktplaats was. Op 13 april 2022 komt eindelijk het bericht dat \u003ca href=\"https://www.rtlnieuws.nl/tech/artikel/5301713/marktplaats-gelijk-oversteken-betalen-versturen-ontvangen-functie-stopt\"\u003emarktplaats stopt met gelijkoversteken service\u003c/a\u003e. Dit is enorm goed nieuws, want dit was niet eens een \u003cem\u003eservice\u003c/em\u003e te noemen.\u003c/p\u003e"},{"title":"Microsoft Teams Desktop with multiple accounts","date_published":"2021-01-13T00:00:00Z","date_modified":"2021-01-13T00:00:00Z","id":"/2021/01/13/teams-with-multiple-accounts/","url":"/2021/01/13/teams-with-multiple-accounts/","tags":["Microsoft Teams","Multi tenant"],"summary":"\u003cp\u003eWe use Microsoft Teams a lot for communication, but once you start using it with multiple accounts you continuously have to switch accounts. That means logging out and signin back in with the other account.\u003c/p\u003e"},{"title":"Adding device support to zigbee2mqtt","date_published":"2020-12-31T00:00:00Z","date_modified":"2020-12-31T00:00:00Z","id":"/2020/12/31/new-device-for-zigbee2mqtt/","url":"/2020/12/31/new-device-for-zigbee2mqtt/","tags":["zigbee2mqtt","Device support","Home Automation"],"summary":"\u003cp\u003eI\u0026rsquo;ve been using \u003ca href=\"https://www.zigbee2mqtt.io\"\u003ezigbee2mqtt\u003c/a\u003e for years (for the people that don\u0026rsquo;t know zigbee2mqtt, it\u0026rsquo;s a great way to get rid of proprietary Zigbee hubs). At the moment I have 38 zigbee devices connected.\u003c/p\u003e"},{"title":"Github pages (Jekyll) live reload with docker","date_published":"2020-12-31T00:00:00Z","date_modified":"2020-12-31T00:00:00Z","id":"/2020/12/31/github-pages-live-reload/","url":"/2020/12/31/github-pages-live-reload/","tags":["GitHub","Github Pages","Jekyll"],"summary":"\u003cp\u003eI really like \u003ca href=\"https://pages.github.com/\"\u003eGithub Pages\u003c/a\u003e to host static webpages. Static in this case means the files are generated at build time (so once when you publish a new version), instead of every time like with a wordpress website. One of the main benefits is that it results in a blazing fast website.\u003c/p\u003e"},{"title":"Azure Functions serve static files","date_published":"2020-11-05T00:00:00Z","date_modified":"2020-11-05T00:00:00Z","id":"/2020/11/05/azure-functions-serve-static-files/","url":"/2020/11/05/azure-functions-serve-static-files/","tags":["Azure Functions","Static files"],"summary":"\u003cp\u003eAzure functions are great to quickly create an API. But did you know you can also host static files with it? Anthony Chu made a \u003ca href=\"https://anthonychu.ca/post/azure-functions-static-file-server/\"\u003egreat post\u003c/a\u003e about hosting static files in Azure Functions. His code is from March 9, 2017 however, and can be improved in the mean time.\u003c/p\u003e"},{"title":"Git extra author","date_published":"2020-07-31T00:00:00Z","date_modified":"2020-07-31T00:00:00Z","id":"/2020/07/31/add-extra-author/","url":"/2020/07/31/add-extra-author/","tags":["Git","GitHub"],"summary":"\u003cp\u003eIf someone else created some source code, but for whatever reason they aren\u0026rsquo;t the one adding it to the repository. You can still have their name/photo in the git commit.\u003c/p\u003e"},{"title":"Fork proof actions","date_published":"2020-07-08T00:00:00Z","date_modified":"2020-07-08T00:00:00Z","id":"/2020/07/08/fork-proof-actions/","url":"/2020/07/08/fork-proof-actions/","tags":["GitHub","Github Actions"],"summary":"\u003cp\u003eGithub actions are a great tool to setup automatic build and tests. I also use it for any of my automatic releases. See \u003ca href=\"https://svrooij.nl/2020/06/automate-your-release-with-github-actions/\"\u003ethis\u003c/a\u003e post.\nUntil now there was one thing missing. If someone would fork the repository, all builds would fail because of missing secrets needed for the release.\u003c/p\u003e\n\u003cp\u003eYesterday I released my \u003ca href=\"https://github.com/svrooij/secret-gate-action\"\u003efirst github action\u003c/a\u003e, it allows you to check if certain secrets are set, and then decide to continue yourself. Or skip specific steps, this functionallity seemed to be missing from the actions marketplace. So now yoou can check the existens of certain secrets (or other inputs), and decide to either have the actioon run fail or just continue and skip some steps.\u003c/p\u003e"},{"title":"Query github sponsors with graphql","date_published":"2020-07-07T00:00:00Z","date_modified":"2020-07-07T00:00:00Z","id":"/2020/07/07/load-github-sponsors/","url":"/2020/07/07/load-github-sponsors/","tags":["GitHub","Github Sponsors"],"summary":"\u003cp\u003eGithub exposes all their data at a \u003ca href=\"https://developer.github.com/v4/\"\u003eGraphQL endpoint\u003c/a\u003e, that you can also try out with the \u003ca href=\"https://developer.github.com/v4/explorer/\"\u003eGithub GraphQL explorer\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003eIf you want to query who is sponsoring you, use the following GraphQL. You can use this query at the explorer of in your own graphql client.\u003c/p\u003e"},{"title":"Wordpress plugin REST in peace","date_published":"2020-06-29T00:00:00Z","date_modified":"2020-06-29T00:00:00Z","id":"/2020/06/29/rest-in-peace/","url":"/2020/06/29/rest-in-peace/","tags":["Wordpress"],"summary":"\u003cp\u003eIn January 2017 I released a plugin for Wordpress called \u003ca href=\"https://wordpress.org/support/plugin/rest-api-filter-fields/\"\u003eWP REST API - filter fields\u003c/a\u003e it had a somewhat limited reach (2000+ active installs according to the stats),\nbut people where using it. It was a plugin on the wordpress rest api (which was also a plugin at that time), it allowed the user to tell the server which fields from the api they wanted back. Because I wasn\u0026rsquo;t changing the api, I was only filtering the output (after everything was retrieved from the database), this didn\u0026rsquo;t make it much faster, but the resulting data to transfer was smaller (which was a big thing 4 years ago).\u003c/p\u003e"},{"title":"Daily rebuild github pages","date_published":"2020-06-27T00:00:00Z","date_modified":"2020-06-27T00:00:00Z","id":"/2020/06/27/rebuild-github-pages/","url":"/2020/06/27/rebuild-github-pages/","tags":["GitHub","Github Actions","Github Pages"],"summary":"\u003cp\u003eToday I switched to \u003ca href=\"https://github.com/github/personal-website\"\u003epersonal website\u003c/a\u003e for my new \u003ca href=\"https://static.svrooij.nl\"\u003epersonal page\u003c/a\u003e on Github.\nIt\u0026rsquo;s a pretty nice template to generate a \u003cstrong\u003estatic page\u003c/strong\u003e with the use of \u003ca href=\"https://jekyllrb.com/\"\u003eJekyll\u003c/a\u003e, at build time it loads some details from github (like my repositories).\nThis means that the page will only show the data of the last time it was build.\u003c/p\u003e"},{"title":"Automate your release with Github Actions","date_published":"2020-06-07T12:15:22Z","date_modified":"2020-06-07T12:15:22Z","id":"/2020/06/07/automate-release-github-actions/","url":"/2020/06/07/automate-release-github-actions/","tags":["automatic release","CI","continuous integration","npm package"],"summary":"\u003cp\u003eI\u0026rsquo;ve got several node/typescript packages on my \u003ca href=\"https://github.com/svrooij/\"\u003eGithub page\u003c/a\u003e. And one of the struggles I faced when starting these, was the manual work needed to release a new version to npm and/or docker hub.\u003c/p\u003e"},{"title":"Smart energy meter","date_published":"2020-04-10T11:33:12Z","date_modified":"2020-04-10T11:33:12Z","id":"/2020/04/10/smart-energy-meter/","url":"/2020/04/10/smart-energy-meter/","tags":["Home Automation","P1","smartmeter"],"summary":"\u003cp\u003eA lot of people in the Netherlands have a smartenergy meter. They send the total usage to the power network provider on a regular interval. But is also has a port that can be used to monitor the usage yourself, and this can be really interesting.\u003c/p\u003e"},{"title":"Quickly connect to Exchange online powershell","date_published":"2020-04-08T09:51:06Z","date_modified":"2020-04-08T09:51:06Z","id":"/2020/04/08/quickly-connect-to-exchange-online-powershell/","url":"/2020/04/08/quickly-connect-to-exchange-online-powershell/","tags":["Office 365","PowerShell","exchange"],"summary":"\u003cp\u003eMicrosoft is making it really easy to manage your Exchange Online environment from every device. You\u0026rsquo;ll need an active Azure subscription and be an Exchange Online admin though.\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003eOpen the online shell \u003ca rel=\"noreferrer noopener\" aria-label=\"https://shell.azure.com (opens in a new tab)\" href=\"https://shell.azure.com\" target=\"_blank\"\u003e\u003ca href=\"https://shell.azure.com\"\u003ehttps://shell.azure.com\u003c/a\u003e\u003c/a\u003e and pick powershell.\u003c/li\u003e\n\u003cli\u003eTyp \u003cstrong\u003eConnect-EXOPSSession\u003c/strong\u003e and press enter\u003c/li\u003e\n\u003cli\u003eWait a little bit for it to connect\u003c/li\u003e\n\u003cli\u003eUse all the \u003ca rel=\"noreferrer noopener\" aria-label=\"supported (opens in a new tab)\" href=\"https://docs.microsoft.com/en-us/powershell/exchange/exchange-online/exchange-online-powershell-v2/exchange-online-powershell-v2?view=exchange-ps\u0026wt.mc_id=SEC-MVP-5004985\" target=\"_blank\"\u003esupported\u003c/a\u003e commands.\u003c/li\u003e\n\u003c/ol\u003e"},{"title":"Professioneel online presenteren","date_published":"2020-04-07T15:37:47Z","date_modified":"2020-04-07T15:37:47Z","id":"/2020/04/07/professioneel-online-presenteren/","url":"/2020/04/07/professioneel-online-presenteren/","tags":["lesgeven","presenteren","streamen","OBS"],"summary":"\u003cp\u003eIedereen is steeds meer online aan het communiceren op dit moment, dat is heel begrijpelijk in de huidige situatie. Hier zal ik in het kort proberen uit te leggen hoe je redelijk eenvoudig een professionele presentatie kan geven.\u003cfigure class=\"wp-block-gallery columns-2 is-cropped\"\u003e\u003c/p\u003e"},{"title":"Expose home automation from the internet","date_published":"2020-01-22T19:28:09Z","date_modified":"2020-01-22T19:28:09Z","id":"/2020/01/22/expose-home-automation-from-the-internet/","url":"/2020/01/22/expose-home-automation-from-the-internet/","tags":["coding","Home Automation"],"summary":"\u003cp\u003eI\u0026rsquo;ve got a lot of home automation devices in my house, most of them are controllable while I\u0026rsquo;m on my local (wifi) network. The web interfaces are in various security levels, ranging from no security to password security.\u003c/p\u003e"},{"title":"Sonos goodness","date_published":"2019-12-28T22:42:11Z","date_modified":"2019-12-28T22:42:11Z","id":"/2019/12/28/sonos-goodness/","url":"/2019/12/28/sonos-goodness/","tags":["Open source","Sonos"],"summary":"\u003cp\u003eI\u0026rsquo;m a big fan of the sonos devices, but I\u0026rsquo;m not a big fan of the Sonos app (mac/windows/android/ios), it just isn\u0026rsquo;t that good. At least the following points should be fixed before I would consider changing my mind:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003eAndroid/iOS -\u0026gt; Alarm settings are hidden to far in the application. (two clicks, a long scroll and another click).\u003c/li\u003e\n\u003cli\u003eSlowly startup, they do device discovery even though all my speakers have a semi-static (dhcp reservation) ip.\u003c/li\u003e\n\u003cli\u003eThe playbar should rejoin the previous group after watching tv.\u003c/li\u003e\n\u003cli\u003eMemory usage on mac\u003c/li\u003e\n\u003cli\u003eNo integration with other systems\u003c/li\u003e\n\u003c/ol\u003e"},{"title":"Developing a typescript library","date_published":"2019-12-28T21:56:08Z","date_modified":"2019-12-28T21:56:08Z","id":"/2019/12/28/developing-a-typescript-library/","url":"/2019/12/28/developing-a-typescript-library/","tags":["Open source","Sonos","TypeScript"],"summary":"\u003cp\u003eI\u0026rsquo;ve been building node libraries for home automation purposes for a while now, see my \u003ca href=\"https://github.com/svrooij/\"\u003erepositories\u003c/a\u003e. I decided that it was time to try out the strong-type goodness you get when using \u003ca href=\"https://www.typescriptlang.org/\"\u003eTypescript\u003c/a\u003e.\u003c/p\u003e"},{"title":"Interesting dotnet blogs","date_published":"2019-12-28T20:38:24Z","date_modified":"2019-12-28T20:38:24Z","id":"/2019/12/28/interesting-dotnet-blogs/","url":"/2019/12/28/interesting-dotnet-blogs/","tags":["Blogs"],"summary":"\u003cul\u003e\n\u003cli\u003e\u003ca rel=\"noreferrer noopener\" aria-label=\"Andrew Lock (opens in a new tab)\" href=\"https://andrewlock.net/\" target=\"_blank\"\u003eAndrew Lock\u003c/a\u003e – Dependency injection, dotnet core, amazon.\u003c/li\u003e\n\u003cli\u003e\u003ca rel=\"noreferrer noopener\" aria-label=\"Scott Hanselman (opens in a new tab)\" href=\"https://www.hanselman.com/blog/\" target=\"_blank\"\u003eScott Hanselman\u003c/a\u003e – dotnet core stuff, diy hacks\u003c/li\u003e\n\u003cli\u003e\u003ca rel=\"noreferrer noopener\" aria-label=\"Scott Brady (opens in a new tab)\" href=\"https://www.scottbrady91.com/\" target=\"_blank\"\u003eScott Brady\u003c/a\u003e – Identity server, security in general\u003c/li\u003e\n\u003cli\u003e\u003ca rel=\"noreferrer noopener\" aria-label=\"Damien Bod (opens in a new tab)\" href=\"https://damienbod.com/aspnetcore/\" target=\"_blank\"\u003eDamien Bod\u003c/a\u003e – mainly Dotnet security/indentity\u003c/li\u003e\n\u003cli\u003e\u003ca rel=\"noreferrer noopener\" aria-label=\"Rick Strahl's Web log (opens in a new tab)\" href=\"https://weblog.west-wind.com/\" target=\"_blank\"\u003eRick Strahl\u0026rsquo;s Web log\u003c/a\u003e – Angular and dotnet core\u003c/li\u003e\n\u003cli\u003e\u003ca rel=\"noreferrer noopener\" aria-label=\"Steve Gordon (opens in a new tab)\" href=\"https://www.stevejgordon.co.uk/\" target=\"_blank\"\u003eSteve Gordon\u003c/a\u003e – HttpClient, new dotnet core features.\u003c/li\u003e\n\u003cli\u003e\u003ca rel=\"noreferrer noopener\" aria-label=\"Brock Allen (opens in a new tab)\" href=\"https://brockallen.com/\" target=\"_blank\"\u003eBrock Allen\u003c/a\u003e – Identity management\u003c/li\u003e\n\u003cli\u003e\u003ca rel=\"noreferrer noopener\" aria-label=\"Visual studio geeks (opens in a new tab)\" href=\"https://www.visualstudiogeeks.com/\" target=\"_blank\"\u003eVisual studio geeks\u003c/a\u003e – Azure devops\u003c/li\u003e\n\u003c/ul\u003e"},{"title":"Install wordpress server site","date_published":"2019-08-22T16:01:16Z","date_modified":"2019-08-22T16:01:16Z","id":"/2019/08/22/install-wordpress-server-site/","url":"/2019/08/22/install-wordpress-server-site/","tags":["Wordpress"],"summary":"\u003cp\u003eYou can install wordpress by using FTP, but sometimes it\u0026rsquo;s much quicker to do it server site. Basic linux knowledge is needed!. First SSH into the server.\u003c/p\u003e"},{"title":"Cache-aside in dotnet core","date_published":"2019-04-30T23:37:59Z","date_modified":"2019-04-30T23:37:59Z","id":"/2019/04/30/cache-aside-in-dotnet-core/","url":"/2019/04/30/cache-aside-in-dotnet-core/","tags":["caching","dotnet"],"summary":"\u003cp\u003eA really nice way to improve performance in any web application is to using caching. This is also true for dotnet core. The \u003ca rel=\"noreferrer noopener\" aria-label=\"Cache-aside (opens in a new tab)\" href=\"https://docs.microsoft.com/nl-nl/azure/architecture/patterns/cache-aside?wt.mc_id=SEC-MVP-5004985\" target=\"_blank\"\u003eCache-aside\u003c/a\u003e pattern is a best described as. Let\u0026rsquo;s check the cache if we got the required result, if we got this item cached return that. If we don\u0026rsquo;t have it in cache, get it from the data store and save it for next time.\u003c/p\u003e\n\u003cp\u003eIn dotnet core you can use both \u003ca href=\"https://www.nuget.org/packages/Microsoft.Extensions.Caching.Memory/\"\u003eMicrosoft.Extentions.Caching.Memory\u003c/a\u003e or some \u003ca href=\"https://docs.microsoft.com/en-us/aspnet/core/performance/caching/distributed?view=aspnetcore-2.2\u0026amp;wt.mc_id=SEC-MVP-5004985\"\u003eDistributed Cache\u003c/a\u003e. Choose either one because you\u0026rsquo;re going to use it down the line.\u003c/p\u003e"},{"title":"JWT: Part 3 \u0026#8211; Sign your own","date_published":"2019-03-29T17:26:29Z","date_modified":"2019-03-29T17:26:29Z","id":"/2019/03/29/jwt-part-3-sign-your-own/","url":"/2019/03/29/jwt-part-3-sign-your-own/","tags":["jwt"],"summary":"\u003cp\u003eThis is part of my JSON Web Token series. This time to show you how to create your own JWTs in dotnet core. Small note, creating your own token server isn\u0026rsquo;t something I would recommend! If you need your own token (identity/login/openid connect) server, have a look at \u003ca rel=\"noreferrer noopener\" aria-label=\"Identity Server (opens in a new tab)\" href=\"http://docs.identityserver.io/en/latest/index.html\" target=\"_blank\"\u003eIdentity Server\u003c/a\u003e and the Identity server with Asp.net Identity \u003ca rel=\"noreferrer noopener\" aria-label=\"quickstart (opens in a new tab)\" href=\"http://docs.identityserver.io/en/latest/quickstarts/8_aspnet_identity.html\" target=\"_blank\"\u003equickstart\u003c/a\u003e.\u003c/p\u003e"},{"title":"JWT: Part 2 \u0026#8211; In the wild","date_published":"2019-03-26T10:00:28Z","date_modified":"2019-03-26T10:00:28Z","id":"/2019/03/26/jwt-part-2-in-the-wild/","url":"/2019/03/26/jwt-part-2-in-the-wild/","tags":["Authentication","jwt"],"summary":"\u003cp\u003eJSON Web Tokens are used everywhere. Microsoft uses them as access tokens for their entire Authentication platform and their Graph API. Google uses them in their applications both in the Login with Google system and in their apis.\u003c/p\u003e"},{"title":"JWT: Part 1 \u0026#8211; Introduction","date_published":"2019-03-25T22:03:28Z","date_modified":"2019-03-25T22:03:28Z","id":"/2019/03/25/jwt-introduction/","url":"/2019/03/25/jwt-introduction/","tags":["API","Authentication","jwt"],"summary":"\u003cp\u003eWhat exactly is a \u003cstrong\u003eJson Web Token?\u003c/strong\u003e I like to describe them as an easy way to digitally sign some json data about a user, that can then be used as an access token for some kind of api. Check out \u003ca rel=\"noreferrer noopener\" aria-label=\"JSON Web Token (opens in a new tab)\" href=\"https://en.wikipedia.org/wiki/JSON_Web_Token\" target=\"_blank\"\u003eJSON Web Token\u003c/a\u003e on wikepedia for an exact description.\u003c/p\u003e\n\u003cp\u003eI really like JWTs because they are verifiable without an additional call to some identity server. They are short-lived by default (at least should be). And it is the best option for access tokens at the moment.\u003c/p\u003e"},{"title":"Generate X509Certificate2 in C#","date_published":"2018-04-18T13:05:45Z","date_modified":"2018-04-18T13:05:45Z","id":"/2018/04/18/generate-x509certificate2-in-csharp/","url":"/2018/04/18/generate-x509certificate2-in-csharp/","tags":["C#","certificate","self-signed"],"summary":"\u003cp\u003eSometimes you just need a \u003cstrong\u003eX509Certificate2\u003c/strong\u003e in your C# code. For authenticating to an external webservice for instance.\u003c/p\u003e\n\u003cp\u003eThis will show you how to create such a certificate right from your C# code. By the way you\u0026rsquo;ll need the \u003ca href=\"https://www.nuget.org/packages/BouncyCastle/\" target=\"_blank\" rel=\"noopener noreferrer\"\u003eBouncy castle\u003c/a\u003e or \u003ca href=\"https://www.nuget.org/packages/BouncyCastle.NetCore/\" target=\"_blank\" rel=\"noopener noreferrer\"\u003eBouncy castle core\u003c/a\u003e library\u003c/p\u003e"},{"title":"Visual studio geeks","date_published":"2018-04-11T22:01:06Z","date_modified":"2018-04-11T22:01:06Z","id":"/2018/04/11/visual-studio-geeks/","url":"/2018/04/11/visual-studio-geeks/","tags":null,"summary":"\u003cp\u003eI just found a really cool article about using deployment gates in VSTS, that use Azure functions to check Github issues.\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"https://www.visualstudiogeeks.com/DevOps/github-issues-as-deployment-gate-in-vsts-rm\"\u003eVisual studio geeks - Check it out\u003c/a\u003e\u003c/p\u003e"},{"title":"XS4All glasvezel met eigen router","date_published":"2017-08-04T13:46:58Z","date_modified":"2017-08-04T13:46:58Z","id":"/2017/08/04/xs4all-glasvezel-met-eigen-router/","url":"/2017/08/04/xs4all-glasvezel-met-eigen-router/","tags":["interactieve TV","kpn","netwerk","xs4all"],"summary":"\u003cp\u003e\u003cstrong\u003eUPDATE\u003c/strong\u003e: XS4ALL drukt de laatste tijd zijn routed IPTV bij iedereen door de strot. Deze handleiding ging over bridged IPTV, dat is niet meer mogelijk. De reacties zijn daarom ook gesloten.\u003c/p\u003e\n\u003cp\u003eStandaard krijg je bij XS4All glasvezel tegenwoordig een \u003ca href=\"https://nl.hardware.info/product/358976/avm-fritzbox-5490/specificaties\" target=\"_blank\" rel=\"noopener noreferrer\"\u003eFritz!Box 5490\u003c/a\u003e. Dit is een consumenten router met een rechtstreekse glasvezel aansluiting. Vanuit XS4All gezien een slimme keuze, want dat scheelt een kastje in de meterkast dat ook kapot kan gaan.\u003c/p\u003e\n\u003cp\u003eMaar er zijn ook andere mogelijkheden, met een beetje technische kennis en wat extra apparatuur is het ook mogelijk om gewoon je oude router te blijven gebruiken. En nog steeds TV te kunnen kijken.\u003c/p\u003e"},{"title":"Angular2 CLI with ASP.NET Core","date_published":"2017-05-16T12:47:50Z","date_modified":"2017-05-16T12:47:50Z","id":"/2017/05/16/angular2-cli-with-asp-net-core/","url":"/2017/05/16/angular2-cli-with-asp-net-core/","tags":[".NET Core","Angular CLI","Angular2"],"summary":"\u003cp\u003eIf you\u0026rsquo;re creating a new Angular2 application, you definitely want to use the \u003ca href=\"https://cli.angular.io\" target=\"_blank\" rel=\"noopener noreferrer\"\u003eAngular2 CLI\u003c/a\u003e. It help you setup a new Angular application. It has a build-in development server and it will generate \u003cstrong\u003eComponents\u003c/strong\u003e for you. This means less typing (isn\u0026rsquo;t that always better?).\u003c/p\u003e"},{"title":"Review: FactuurSturen.nl","date_published":"2017-01-18T20:33:43Z","date_modified":"2017-01-18T20:33:43Z","id":"/2017/01/18/review-factuursturen-nl/","url":"/2017/01/18/review-factuursturen-nl/","tags":["administratie","factuursturen.nl"],"summary":"\u003cp\u003eIk vind het leuk om opdrachten voor bedrijven te doen vanuit mijn bedrijf \u003ca href=\"https://smartersoft.nl\"\u003eSmartersoft\u003c/a\u003e, maar ik heb een hekel aan administratie. Het gevolg, mijn administratie is een beetje een zooi en daardoor kost het elke keer meer tijd dan er eigenlijk voor nodig is.\u003c/p\u003e\n\u003cp\u003eIk heb afgelopen jaar Invoice2Go gebruikt, maar deze website is niet zo goed bevallen omdat ik daarnaast ook nog los iets moest bijhouden voor de inkomende facturen. Vanaf dit jaar gebruikt ik \u003ca href=\"https://www.factuursturen.nl/?a=3023\" target=\"_blank\" rel=\"noopener noreferrer\"\u003eFactuurSturen.nl\u003c/a\u003e en ik ben tot nu toe erg enthousiast.\u003c/p\u003e"},{"title":"Getting started with Angular2 and .NET core","date_published":"2017-01-10T15:23:43Z","date_modified":"2017-01-10T15:23:43Z","id":"/2017/01/10/getting-started-with-angular2-and-net-core/","url":"/2017/01/10/getting-started-with-angular2-and-net-core/","tags":[".NET Core","Angular2"],"summary":"\u003cp\u003eI\u0026rsquo;ve found a few nice articles to get you started with Angular 2 and .NET core. Normally it would be somewhat of a hassle to get started, but this should provide you with some working samples.\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\u003ca href=\"https://jonhilton.net/2016/12/01/fast-track-your-angular-2-and-net-core-web-app-development/\" target=\"_blank\"\u003eFast track your Angular 2 and .NET Core\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://jonhilton.net/2016/12/13/angular-2-and-net-core-your-first-component/\" target=\"_blank\"\u003eAngular 2 and .NET Core – your first component\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://jonhilton.net/2017/01/03/angular-2-and-net-core-route-to-an-angular-component/\" target=\"_blank\"\u003eAngular 2 and .NET Core – route directly to your components\u003c/a\u003e\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003eThis is a series of posts by Jon Hilton and uses the \u003ca href=\"https://marketplace.visualstudio.com/items?itemName=MadsKristensen.ASPNETCoreTemplatePack\"\u003eASP.NET Core Template Pack\u003c/a\u003e to get started.\u003c/p\u003e"},{"title":"Youtube link to Embed code","date_published":"2016-12-29T01:04:50Z","date_modified":"2016-12-29T01:04:50Z","id":"/2016/12/29/youtube-link-to-embed-code/","url":"/2016/12/29/youtube-link-to-embed-code/","tags":["embed","regular expressions","youtube"],"summary":"\u003cp\u003eAllowing users of your website to include a video into a message, can be done in two ways.\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003eYou instruct all the users to go to the video page, find the embed code, let them upload html to your website and displaying the raw html to all users.\u003c/li\u003e\n\u003cli\u003eYou tell them to paste the link to the youtube page, and your website generates the embed code right from that link.\u003c/li\u003e\n\u003c/ol\u003e"},{"title":"CreatedAt property with Entity framework","date_published":"2016-06-15T14:13:48Z","date_modified":"2016-06-15T14:13:48Z","id":"/2016/06/15/entity-framework-auto-timestamp/","url":"/2016/06/15/entity-framework-auto-timestamp/","tags":["Entity framework"],"summary":"\u003cp\u003eYou\u0026rsquo;re building a new application, and you\u0026rsquo;re using Entity Framework Code First. Probably all your entities need an \u003cstrong\u003eId\u003c/strong\u003e and \u003cstrong\u003eCreatedAt/UpdatedAt\u003c/strong\u003e property.\u003c/p\u003e\n\u003cp\u003eThe sample below shows you how to define these properties in a base class, and (more importantly) how to set them correctly on every save, without setting them manually on every place where you\u0026rsquo;re changing things.\u003c/p\u003e"},{"title":"WordPress just got even better!","date_published":"2015-12-09T23:47:48Z","date_modified":"2015-12-09T23:47:48Z","id":"/2015/12/09/wordpress-just-got-even-better/","url":"/2015/12/09/wordpress-just-got-even-better/","tags":["API","Wordpress","plugin","rest"],"summary":"\u003cp\u003eYesterday \u003cstrong\u003eWordPress 4.4\u003c/strong\u003e was released, with this version they improved this product even more.\u003c/p\u003e\n\u003cp\u003eThe most notable new features are, support for \u003cstrong\u003eoEmbed\u003c/strong\u003e and an integrated \u003cstrong\u003eREST API\u003c/strong\u003e.\u003c/p\u003e\n\u003cp\u003eWhat is \u003cstrong\u003eoEmbed\u003c/strong\u003e and why is this a new amazing feature? oEmbed is a specification for embedding content from an other website right inside the consuming website. This enables (for instance) Twitter to display the excerpt of a post instead of just a link to your wordpress website. This specification is originally design by (members of) Flicr, but with the wordpress implementation the adoption will get even bigger.\u003c/p\u003e"},{"title":"Hosting a wordpress plugin on Github","date_published":"2015-10-29T13:04:59Z","date_modified":"2015-10-29T13:04:59Z","id":"/2015/10/29/wordpress-plugin-on-github/","url":"/2015/10/29/wordpress-plugin-on-github/","tags":["Wordpress","github","grunt","plugin"],"summary":"\u003cp\u003eSomeone at \u003ca href=\"http://wordpress.org\" target=\"_blank\"\u003eWordPress\u003c/a\u003e decided that if you want to create a plugin for WordPress, you\u0026rsquo;ll have to host it at their SVN server. Personally I\u0026rsquo;m not a big fan of SVN, I\u0026rsquo;m more a GIT person.\u003c/p\u003e\n\u003cp\u003eLucky for me, it appears I\u0026rsquo;m not the only one. So for my latest WordPress plugin (\u003ca href=\"https://wordpress.org/plugins/rest-api-filter-fields/\" target=\"_blank\"\u003eREST API – Filter Fields\u003c/a\u003e) I used \u003ca href=\"https://github.com/svrooij/rest-api-filter-fields/\" target=\"_blank\"\u003eGithub\u003c/a\u003e. Then I came to a few problems that had to be solved.\u003c/p\u003e"},{"title":"Filter the fields returned by the wordpress api","date_published":"2015-10-29T12:22:08Z","date_modified":"2015-10-29T12:22:08Z","id":"/2015/10/29/filter-fields-returned-by-wordpress-api/","url":"/2015/10/29/filter-fields-returned-by-wordpress-api/","tags":["API","Wordpress","plugin","rest"],"summary":"\u003cp\u003e\u003ca href=\"http://wordpress.org\" target=\"_blank\"\u003eWordPress\u003c/a\u003e is a great platform for running a website with a content management system behind it. Around a year ago the released a plugin called \u003ca href=\"https://wordpress.org/plugins/rest-api/\" target=\"_blank\"\u003eWordPress REST API\u003c/a\u003e. And this is a really nice addition to WordPress. This plugin enables you to retrieve all the posts/comments/terms in a really easy JSON format.\u003c/p\u003e"},{"title":"Mooie aanbieding of misleiding?","date_published":"2015-10-21T13:03:30Z","date_modified":"2015-10-21T13:03:30Z","id":"/2015/10/21/mooie-aanbieding-of-misleiding/","url":"/2015/10/21/mooie-aanbieding-of-misleiding/","tags":null,"summary":"\u003cp\u003eOp advies van mijn moeder heb ik mijzelf laatst aangemeld voor een \u003cstrong\u003eproefabonnement\u003c/strong\u003e voor de \u003ca href=\"http://volkskrant.nl\" target=\"_blank\"\u003eVolkskrant\u003c/a\u003e. Bij het aanmelden stond al een opmerkelijk \u003cem\u003eIk accepteer vinkje\u003c/em\u003e, namelijk:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eIk ga akkoord met de voorwaarden en ontvang per e-mail, sms en telefoon exclusieve abonnee- en kortingsaanbiedingen.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eMaar ik wil toch wel eens proberen of deze krant iets voor mij is, dus ik heb het gewoon aangevinkt (zonder overigens de rest van de \u003ccode\u003evoorwaarden\u003c/code\u003e te lezen).\u003c/p\u003e"},{"title":"Shutdown your mac with the keyboard","date_published":"2015-05-01T21:34:20Z","date_modified":"2015-05-01T21:34:20Z","id":"/2015/05/01/shutdown-your-mac-with-keyboard/","url":"/2015/05/01/shutdown-your-mac-with-keyboard/","tags":["mac","shutdown"],"summary":"\u003cp\u003eWith my Windows computer I could control the power button action.\u003c/p\u003e\n\u003cp\u003eI was a bit disappointed that you cannot control this action on a Mac. But now I found out that there is a keyboard shortcut to instantly shutdown your mac.\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003eCMD\u003c/code\u003e + \u003ccode\u003ealt\u003c/code\u003e + \u003ccode\u003ectrl\u003c/code\u003e + \u003ccode\u003ePower button\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003eI know it is a horrible shortcut, but it works!!\u003c/p\u003e"},{"title":"WordPress mail with Gmail","date_published":"2015-05-01T19:38:09Z","date_modified":"2015-05-01T19:38:09Z","id":"/2015/05/01/wordpress-mail-with-gmail/","url":"/2015/05/01/wordpress-mail-with-gmail/","tags":["Wordpress","gmail"],"summary":"\u003cp\u003eAt some point you would like your wordpress website to be able to send email. You\u0026rsquo;ll need it for:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003ePassword recovery\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eNew User\u003c/code\u003e notifications\u003c/li\u003e\n\u003cli\u003eContact forms\u003c/li\u003e\n\u003c/ul\u003e"},{"title":"Homescreen application","date_published":"2015-04-26T10:42:48Z","date_modified":"2015-04-26T10:42:48Z","id":"/2015/04/26/homescreen-application/","url":"/2015/04/26/homescreen-application/","tags":["homescreen","iphone","webapp"],"summary":"\u003cp\u003eIt is quitte easy to create a mobile website. With these tweaks it will look even more like a real application.\u003c/p\u003e\n\u003cp\u003eYou\u0026rsquo;ll just have to append some items to the html source code.\u003c/p\u003e"},{"title":"Resolve exchange alias to SMTP address","date_published":"2015-04-04T13:16:52Z","date_modified":"2015-04-04T13:16:52Z","id":"/2015/04/04/resolve-exchange-alias-to-smtp-address/","url":"/2015/04/04/resolve-exchange-alias-to-smtp-address/","tags":["Exchange"],"summary":"\u003cp\u003eWhen working with Exchange, you\u0026rsquo;ll sometimes need the primary address and not some kind of alias. This snippet helps you with that.\u003c/p\u003e"},{"title":"Why most C# apps lack https security","date_published":"2015-04-04T13:10:35Z","date_modified":"2015-04-04T13:10:35Z","id":"/2015/04/04/c-sharp-apps-lack-https-security/","url":"/2015/04/04/c-sharp-apps-lack-https-security/","tags":["Security"],"summary":"\u003cp\u003eA lot of apps build in C# (or probably any other language) lack the basic protection against \u003cstrong\u003e\u003ca title=\"Wikipedia Man-in-the-middle attack\" href=\"http://en.wikipedia.org/wiki/Man-in-the-middle_attack\" target=\"_blank\"\u003eMan-in-the-middle-attacks\u003c/a\u003e\u003c/strong\u003e. One of the reasons I could find for this is because of the following.\u003c/p\u003e"},{"title":"Block certain facebook apps?","date_published":"2013-04-04T12:44:54Z","date_modified":"2013-04-04T12:44:54Z","id":"/2013/04/04/block-certain-facebook-apps/","url":"/2013/04/04/block-certain-facebook-apps/","tags":["facebook","lifehack"],"summary":"\u003cp\u003eDon\u0026rsquo;t you hate those games that keep appearing on your facebook timelime or in the notifications? Facebook has a feature to totally block an app.\u003c/p\u003e\n\u003ch2 id=\"block-annoying-facebook-apps\"\u003e\u003ca href=\"https://www.facebook.com/settings?tab=blocking\"\u003eBlock (annoying) facebook apps\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eThe apps I blocked are most of the apps containing \u003ccode\u003e*ville\u003c/code\u003e or \u003ccode\u003e*sage\u003c/code\u003e or \u003ccode\u003e*bash\u003c/code\u003e. They also have a nice search function. Just type one of these words and click the most used ones.\u003c/p\u003e"}]}