<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" version="2.0">
  <channel>
    <title>IIS Support Blog articles</title>
    <link>https://techcommunity.microsoft.com/t5/iis-support-blog/bg-p/IIS-Support-Blog</link>
    <description>IIS Support Blog articles</description>
    <pubDate>Thu, 23 Apr 2026 23:05:43 GMT</pubDate>
    <dc:creator>IIS-Support-Blog</dc:creator>
    <dc:date>2026-04-23T23:05:43Z</dc:date>
    <item>
      <title>How to Add an Adaptive Card in Microsoft 365 Agent SDK</title>
      <link>https://techcommunity.microsoft.com/t5/iis-support-blog/how-to-add-an-adaptive-card-in-microsoft-365-agent-sdk/ba-p/4472022</link>
      <description>&lt;P data-start="816" data-end="983"&gt;One of the most important UI capabilities is &lt;STRONG data-start="861" data-end="879"&gt;Adaptive Cards&lt;/STRONG&gt;, which let your agent send structured, interactive content such as forms, inputs, buttons, and layouts.&lt;/P&gt;
&lt;P data-start="1017" data-end="1060"&gt;In this guide, you’ll learn exactly how to:&lt;/P&gt;
&lt;UL data-start="1062" data-end="1232"&gt;
&lt;LI data-start="1062" data-end="1089"&gt;Create an Agent SDK bot&lt;/LI&gt;
&lt;LI data-start="1090" data-end="1133"&gt;Send an Adaptive Card when a user joins&lt;/LI&gt;
&lt;LI data-start="1134" data-end="1175"&gt;Handle Action.Execute submit events&lt;/LI&gt;
&lt;LI data-start="1176" data-end="1210"&gt;Parse user input from the card&lt;/LI&gt;
&lt;LI data-start="1211" data-end="1232"&gt;Respond with text&lt;/LI&gt;
&lt;/UL&gt;
&lt;P data-start="1234" data-end="1297"&gt;I will walk through the&lt;STRONG&gt; &lt;/STRONG&gt;full working code from my project.&lt;BR /&gt;&lt;BR /&gt;You can download complete sample from : &lt;A class="lia-external-url" href="https://github.com/MeenakshiBalekar/M365AgentSDK" target="_blank"&gt;M365AgentSDKAdaptiveCard&lt;/A&gt;&lt;/P&gt;
&lt;H1 data-start="1304" data-end="1371"&gt;&lt;STRONG data-start="1306" data-end="1371"&gt;Step 1: Understanding How Adaptive Cards Work in Agent SDK&lt;/STRONG&gt;&lt;/H1&gt;
&lt;P data-start="1373" data-end="1420"&gt;Adaptive Cards are sent in the Agent SDK using:&lt;/P&gt;
&lt;LI-CODE lang="csharp"&gt;var attachment = new Attachment {
    ContentType = "application/vnd.microsoft.card.adaptive",
    Content = &amp;lt;JSON&amp;gt;
};
&lt;/LI-CODE&gt;
&lt;P data-start="1556" data-end="1585"&gt;You then send them like this:&lt;/P&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;await turnContext.SendActivityAsync(MessageFactory.Attachment(attachment));&lt;/P&gt;
&lt;/BLOCKQUOTE&gt;
&lt;P data-start="1678" data-end="1750"&gt;And to handle submit actions (Action.Execute), the Agent SDK triggers:&lt;/P&gt;
&lt;LI-CODE lang="csharp"&gt;ActivityTypes.Invoke  
Name = "adaptiveCard/action"&lt;/LI-CODE&gt;
&lt;H1 data-start="1858" data-end="1905"&gt;&lt;STRONG data-start="1860" data-end="1905"&gt;Step 2: Use the Adaptive Card Designer&lt;/STRONG&gt;&lt;/H1&gt;
&lt;P data-start="1907" data-end="1987"&gt;Create or test your card on our new designer here: &lt;A href="https://adaptivecards.microsoft.com/designer" target="_blank" rel="noopener" data-start="1943" data-end="1987"&gt;https://adaptivecards.microsoft.com/designer&lt;/A&gt;&lt;/P&gt;
&lt;P data-start="1989" data-end="2006"&gt;Your sample card:&lt;/P&gt;
&lt;UL data-start="2008" data-end="2082"&gt;
&lt;LI data-start="2008" data-end="2031"&gt;Collects name &amp;amp; age&lt;/LI&gt;
&lt;LI data-start="2032" data-end="2082"&gt;Uses Action.Execute with verb "personalInfo"&lt;/LI&gt;
&lt;/UL&gt;
&lt;H1 data-start="2089" data-end="2137"&gt;&lt;STRONG data-start="2091" data-end="2137"&gt;Step 3: The Full Working Agent SDK Code&lt;/STRONG&gt;&lt;/H1&gt;
&lt;P data-start="2139" data-end="2192"&gt;Below is the complete working implementation showing:&lt;/P&gt;
&lt;P data-start="2194" data-end="2298"&gt;✔ Welcome card using Adaptive Card&lt;BR data-start="2228" data-end="2231" /&gt;✔ Parsing Action.Execute values&lt;BR data-start="2264" data-end="2267" /&gt;✔ Responding back to the user&lt;/P&gt;
&lt;P data-start="2300" data-end="2388"&gt;This is based entirely on your code, cleaned up and rewritten for clarity &amp;amp; correctness.&lt;/P&gt;
&lt;H2 data-start="2395" data-end="2445"&gt;&lt;STRONG data-start="2400" data-end="2445"&gt;Complete Agent SDK Bot with Adaptive Card&lt;/STRONG&gt;&lt;/H2&gt;
&lt;LI-CODE lang="csharp"&gt;using Microsoft.Agents.Builder;
using Microsoft.Agents.Builder.App;
using Microsoft.Agents.Builder.State;
using Microsoft.Agents.Core.Models;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;

using System.Text.Json;
using System.Text.Json.Nodes;
using System.Threading;
using System.Threading.Tasks;

namespace MyFirstAgentSDK.Bot;

public class EchoBot : AgentApplication
{
    public EchoBot(AgentApplicationOptions options, IHostEnvironment env, ILoggerFactory loggerFactory) : base(options)
    {
        OnConversationUpdate(ConversationUpdateEvents.MembersAdded, WelcomeMessageAsync);
        OnActivity(ActivityTypes.Message, OnMessageAsync, rank: RouteRank.Last);
        OnActivity(ActivityTypes.Invoke, OnInvokeAsync);
    }

    private async Task WelcomeMessageAsync(ITurnContext turnContext, ITurnState turnState, CancellationToken cancellationToken)
    {
        foreach (ChannelAccount member in turnContext.Activity.MembersAdded)
        {
            if (member.Id != turnContext.Activity.Recipient.Id)
            {
                var attachment = new Attachment
                {
                    ContentType = "application/vnd.microsoft.card.adaptive",
                    Content = """
{
  "type": "AdaptiveCard",
  "version": "1.4",
  "schema": "http://adaptivecards.io/schemas/adaptive-card.json",
  "body": [
    {
      "type": "Container",
      "items": [
        {
          "type": "TextBlock",
          "text": "Please enter your personal information",
          "weight": "Bolder",
          "size": "Medium",
          "color": "Accent"
        },
        {
          "type": "Input.Text",
          "id": "Name",
          "label": "What's your name?",
          "placeholder": "Enter your full name",
          "maxLength": 50,
          "isRequired": true,
          "errorMessage": "Name is required"
        },
        {
          "type": "Input.Number",
          "id": "Age",
          "label": "How old are you?",
          "placeholder": "Enter your age",
          "min": 1,
          "max": 150,
          "isRequired": true,
          "errorMessage": "Please enter a valid age between 1 and 150"
        }
      ],
      "style": "emphasis",
      "spacing": "Medium"
    }
  ],
  "actions": [
    {
      "type": "Action.Execute",
      "title": "Submit",
      "verb": "personalInfo",
      "style": "positive"
    }
  ]
}
"""
                };
                await turnContext.SendActivityAsync(MessageFactory.Attachment(attachment), cancellationToken);
            }
            else
            {
                await turnContext.SendActivityAsync(MessageFactory.Text("Hello and Welcome!"), cancellationToken);
            }
        }
    }

    private async Task OnMessageAsync(ITurnContext turnContext, ITurnState turnState, CancellationToken cancellationToken)
    {
        await turnContext.SendActivityAsync($"You said: {turnContext.Activity.Text}", cancellationToken: cancellationToken);
    }

    private async Task OnInvokeAsync(ITurnContext turnContext, ITurnState turnState, CancellationToken cancellationToken)
    {
        if (turnContext.Activity.Name == "adaptiveCard/action")
        {
            JsonElement root;
            if (turnContext.Activity.Value is JsonElement element)
            {
                root = element;
            }
            else
            {
                var json = JsonSerializer.Serialize(turnContext.Activity.Value);
                root = JsonDocument.Parse(json).RootElement;
            }

            if (root.TryGetProperty("action", out var action))
            {
                if (action.TryGetProperty("verb", out var verbElement) &amp;amp;&amp;amp; verbElement.GetString() == "personalInfo")
                {
                    if (action.TryGetProperty("data", out var data))
                    {
                        var name = data.GetProperty("Name").GetString();
                        var age = data.GetProperty("Age").ToString();

                        await turnContext.SendActivityAsync(MessageFactory.Text($"Hello {name}, you are {age} years old!"), cancellationToken);

                        var invokeResponse = new Activity
                        {
                            Type = ActivityTypes.InvokeResponse,
                            Value = new InvokeResponse { Status = 200 }
                        };
                        await turnContext.SendActivityAsync(invokeResponse, cancellationToken);
                    }
                }
            }
        }
    }
}
&lt;/LI-CODE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;H1 data-start="7632" data-end="7668"&gt;&lt;STRONG data-start="7634" data-end="7668"&gt;Step 4: What This Code Does&lt;/STRONG&gt;&lt;/H1&gt;
&lt;H3 data-start="7670" data-end="7727"&gt;&lt;STRONG data-start="7676" data-end="7727"&gt;1. Sends an Adaptive Card when a new user joins or as per your criteria&amp;nbsp;&lt;/STRONG&gt;&lt;/H3&gt;
&lt;P data-start="7729" data-end="7747"&gt;The card that I have used includes:&lt;/P&gt;
&lt;UL data-start="7749" data-end="7853"&gt;
&lt;LI data-start="7749" data-end="7757"&gt;Text&lt;/LI&gt;
&lt;LI data-start="7758" data-end="7783"&gt;Name input (required)&lt;/LI&gt;
&lt;LI data-start="7784" data-end="7808"&gt;Age input (required)&lt;/LI&gt;
&lt;LI data-start="7809" data-end="7853"&gt;A submit button with verb "personalInfo"&lt;/LI&gt;
&lt;/UL&gt;
&lt;H3 data-start="7860" data-end="7900"&gt;&lt;STRONG data-start="7866" data-end="7900"&gt;2. When the user clicks Submit&lt;/STRONG&gt;&lt;/H3&gt;
&lt;P data-start="7902" data-end="7934"&gt;Teams / Message Extension sends:&lt;/P&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;invoke name = adaptiveCard/action&lt;/P&gt;
&lt;P data-start="7979" data-end="8006"&gt;OnInvokeAsync() receives:&lt;/P&gt;
&lt;P&gt;{ "action": { "verb": "personalInfo", "data": { "Name": "...", "Age": "..." } } }&lt;/P&gt;
&lt;/BLOCKQUOTE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;H3 data-start="8136" data-end="8185"&gt;&lt;STRONG data-start="8142" data-end="8185"&gt;3. Bot parses and sends a text response&lt;/STRONG&gt;&lt;/H3&gt;
&lt;P data-start="8187" data-end="8202"&gt;Example output:&lt;/P&gt;
&lt;P&gt;Hello Meenakshi, you are 30 years old! ( P.S I am older than this )&lt;BR /&gt;&lt;BR /&gt;&lt;/P&gt;
&lt;P&gt;Locally when you run the project on playground it looks like :&lt;BR /&gt;&lt;BR /&gt;&amp;nbsp;&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;This is how it looks on test in webchat&amp;nbsp;&lt;BR /&gt;&lt;BR /&gt;&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;And this how it looks on teams :&lt;/P&gt;
&lt;img /&gt;
&lt;H3 data-start="8257" data-end="8294"&gt;&lt;STRONG data-start="8263" data-end="8294"&gt;4. Responds with 200 status&lt;/STRONG&gt;&lt;/H3&gt;
&lt;P data-start="8296" data-end="8330"&gt;This is required for Teams &amp;amp; M365:&lt;/P&gt;
&lt;LI-CODE lang="csharp"&gt; var invokeResponse = new Activity
 {
     Type = ActivityTypes.InvokeResponse,
     Value = new InvokeResponse { Status = 200 }
 };
 await turnContext.SendActivityAsync(invokeResponse, cancellationToken);&lt;/LI-CODE&gt;
&lt;H1 data-start="8458" data-end="8474"&gt;&lt;STRONG data-start="8460" data-end="8474"&gt;Conclusion&lt;/STRONG&gt;&lt;/H1&gt;
&lt;P data-start="8476" data-end="8509"&gt;With the Microsoft 365 Agent SDK:&lt;/P&gt;
&lt;UL data-start="8511" data-end="8800"&gt;
&lt;LI data-start="8603" data-end="8667"&gt;Action.Execute events are handled inside &lt;STRONG data-start="8648" data-end="8667"&gt;OnInvokeAsync&lt;/STRONG&gt;&lt;/LI&gt;
&lt;LI data-start="8668" data-end="8731"&gt;Inputs are parsed through the &lt;STRONG data-start="8700" data-end="8718"&gt;Activity.Value&lt;/STRONG&gt; JSON payload&lt;/LI&gt;
&lt;LI data-start="8732" data-end="8800"&gt;The SDK is lightweight and much simpler than the old Azure Bot SDK&lt;/LI&gt;
&lt;/UL&gt;
&lt;P data-start="8802" data-end="8889"&gt;Your bot is now fully capable of collecting structured user input using Adaptive Cards.&lt;/P&gt;
&lt;P data-start="8802" data-end="8889"&gt;Drop in any queries or samples that you would like me to explain.&lt;/P&gt;
&lt;P data-start="8802" data-end="8889"&gt;Happy Learning!&lt;/P&gt;</description>
      <pubDate>Wed, 01 Apr 2026 01:12:58 GMT</pubDate>
      <guid>https://techcommunity.microsoft.com/t5/iis-support-blog/how-to-add-an-adaptive-card-in-microsoft-365-agent-sdk/ba-p/4472022</guid>
      <dc:creator>meenakshiBalekar</dc:creator>
      <dc:date>2026-04-01T01:12:58Z</dc:date>
    </item>
    <item>
      <title>Let's Create Our First Microsoft 365 Agent SDK using Python - For Single Tenant</title>
      <link>https://techcommunity.microsoft.com/t5/iis-support-blog/let-s-create-our-first-microsoft-365-agent-sdk-using-python-for/ba-p/4472256</link>
      <description>&lt;H1 data-start="678" data-end="729"&gt;&lt;STRONG data-start="682" data-end="729"&gt;Step 1: Set Up Your Development Environment&lt;/STRONG&gt;&lt;/H1&gt;
&lt;P data-start="731" data-end="881"&gt;I am using&amp;nbsp;&lt;STRONG data-start="743" data-end="754"&gt;VS Code&lt;/STRONG&gt;, so you don’t need to manually install Python on your system (unless you want to).&lt;BR data-start="837" data-end="840" /&gt;VS Code can handle Python via extensions which makes it super easy and everything at once place.&amp;nbsp;&lt;BR /&gt;&lt;BR /&gt;You can download complete sample : &lt;A class="lia-external-url" href="https://github.com/MeenakshiBalekar/M365AgentSDKPython" target="_blank"&gt;here&lt;/A&gt;&lt;/P&gt;
&lt;H3 data-start="883" data-end="926"&gt;Install These Extensions in VS Code&lt;/H3&gt;
&lt;P data-start="927" data-end="963"&gt;Open VS Code → Extensions → install:&lt;/P&gt;
&lt;OL data-start="965" data-end="1105"&gt;
&lt;LI data-start="965" data-end="990"&gt;Python (Microsoft)&lt;/LI&gt;
&lt;LI data-start="1008" data-end="1053"&gt;Dev Tunnels (optional but helpful)&lt;/LI&gt;
&lt;LI data-start="1008" data-end="1053"&gt;GitHub Pull Requests &amp;amp; Issues ( Saves a lot of Download time)&lt;EM data-start="1027" data-end="1051"&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;/EM&gt;&lt;img /&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;/LI&gt;
&lt;/OL&gt;
&lt;P data-start="1107" data-end="1120"&gt;These ensure:&lt;/P&gt;
&lt;UL data-start="1121" data-end="1262"&gt;
&lt;LI data-start="1121" data-end="1173"&gt;You can run Python files directly inside VS Code&lt;/LI&gt;
&lt;LI data-start="1174" data-end="1206"&gt;IntelliSense / linting works&lt;/LI&gt;
&lt;LI data-start="1207" data-end="1262"&gt;Dev tunnel commands work in the integrated terminal&lt;/LI&gt;
&lt;/UL&gt;
&lt;H1 data-start="1269" data-end="1310"&gt;&lt;STRONG data-start="1273" data-end="1310"&gt;Step 2: Download/Clone the Official Sample&lt;/STRONG&gt;&lt;/H1&gt;
&lt;P data-start="1312" data-end="1414"&gt;I am using this exact sample: &lt;A class="lia-external-url" href="https://github.com/microsoft/Agents/tree/main/samples/python/cards" target="_blank" rel="noopener" data-start="1348" data-end="1414"&gt;Agent SDK Python Cards&lt;/A&gt;&lt;/P&gt;
&lt;P data-start="1416" data-end="1459"&gt;Run these commands inside VS Code Terminal:&lt;/P&gt;
&lt;LI-CODE lang="git"&gt;git clone https://github.com/microsoft/Agents.git cd Agents/samples/python/cards&lt;/LI-CODE&gt;
&lt;P data-start="1555" data-end="1609"&gt;You now have the complete working Python Agent sample.&lt;/P&gt;
&lt;H1 data-start="1616" data-end="1661"&gt;&lt;STRONG data-start="1620" data-end="1661"&gt;Step 3: Install All Required Packages&lt;/STRONG&gt;&lt;/H1&gt;
&lt;P data-start="1663" data-end="1696"&gt;Inside the &lt;STRONG data-start="1674" data-end="1683"&gt;cards&lt;/STRONG&gt; folder, run:&lt;/P&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;pip install -r requirements.txt&lt;/P&gt;
&lt;/BLOCKQUOTE&gt;
&lt;P data-start="1743" data-end="1757"&gt;This installs:&lt;/P&gt;
&lt;UL data-start="1758" data-end="1814"&gt;
&lt;LI data-start="1758" data-end="1769"&gt;FastAPI&lt;/LI&gt;
&lt;LI data-start="1770" data-end="1781"&gt;Uvicorn&lt;/LI&gt;
&lt;LI data-start="1782" data-end="1796"&gt;Agents SDK&lt;/LI&gt;
&lt;LI data-start="1797" data-end="1807"&gt;dotenv&lt;/LI&gt;
&lt;/UL&gt;
&lt;P data-start="1818" data-end="1898"&gt;VS Code will automatically detect and configure a Python interpreter for you. Once done, your requirements.txt file will look like :&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;H1 data-start="1905" data-end="1949"&gt;&lt;STRONG data-start="1909" data-end="1949"&gt;Step 4: Add Your M365 Agent Configuration&lt;/STRONG&gt;&lt;/H1&gt;
&lt;P data-start="1951" data-end="1981"&gt;Inside the folder, you’ll see:&lt;/P&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;.env.TEMPLATE&lt;/P&gt;
&lt;P data-start="2006" data-end="2019"&gt;Rename it to:&lt;/P&gt;
&lt;P&gt;.env&lt;/P&gt;
&lt;/BLOCKQUOTE&gt;
&lt;P data-start="2035" data-end="2066"&gt;Then open the file and fill in:&lt;/P&gt;
&lt;LI-CODE lang="json"&gt;CONNECTIONS__SERVICE_CONNECTION__SETTINGS__CLIENTID=
CONNECTIONS__SERVICE_CONNECTION__SETTINGS__CLIENTSECRET=
CONNECTIONS__SERVICE_CONNECTION__SETTINGS__TENANTID=
&lt;/LI-CODE&gt;
&lt;P&gt;Here I am creating a single tenant bot, hence I am suing these settings for MSI it will be different&lt;BR /&gt;You can refer the different type of available authentication types &lt;A class="lia-external-url" href="https://learn.microsoft.com/en-us/microsoft-365/agents-sdk/microsoft-authentication-library-configuration-options" target="_blank"&gt;here&lt;/A&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;/P&gt;
&lt;PRE class="line-numbers language-json" tabindex="0" contenteditable="false" data-lia-code-value="Python -m src.main"&gt;&lt;CODE&gt;Python -m src.main&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P data-start="2157" data-end="2266"&gt;&lt;BR /&gt;Where do these values come from?&lt;BR data-start="2189" data-end="2192" /&gt;Your Azure portal -&amp;gt; App Registration/ Managed Identity ( Depending on what type of application is created)&lt;/P&gt;
&lt;H1 data-start="2343" data-end="2380"&gt;&lt;STRONG data-start="2347" data-end="2380"&gt;Step 5: Run the M365 Agent Locally&lt;/STRONG&gt;&lt;/H1&gt;
&lt;P data-start="2382" data-end="2399"&gt;Start your Agent:&lt;BR /&gt;&lt;BR /&gt;&lt;/P&gt;
&lt;LI-CODE lang="json"&gt;Python -m src.main&lt;/LI-CODE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;img /&gt;
&lt;P data-start="2587" data-end="2622"&gt;You will see :&lt;/P&gt;
&lt;img /&gt;
&lt;P data-start="2624" data-end="2669"&gt;But you will not be able to test the bot here locally, so we would need additional tools to help us test locally.&lt;/P&gt;
&lt;H1 data-start="2676" data-end="2711"&gt;&lt;STRONG data-start="2680" data-end="2711"&gt;Step 6: Create a Dev Tunnel&lt;/STRONG&gt;&lt;/H1&gt;
&lt;P data-start="2713" data-end="2788"&gt;You must expose your local bot over HTTPS.&lt;BR data-start="2755" data-end="2758" /&gt;For that we use &lt;A class="lia-external-url" href="https://learn.microsoft.com/en-us/azure/developer/dev-tunnels/get-started" target="_blank" rel="noopener"&gt;&lt;STRONG data-start="2774" data-end="2787"&gt;devtunnel&lt;/STRONG&gt;&lt;/A&gt;.&amp;nbsp;&lt;/P&gt;
&lt;H3 data-start="2790" data-end="2829"&gt;Step 6.1 — Authenticate devtunnel&lt;/H3&gt;
&lt;P data-start="2831" data-end="2875"&gt;You must&amp;nbsp;authenticate first or you’ll get:&lt;/P&gt;
&lt;BLOCKQUOTE&gt;
&lt;P data-start="2877" data-end="2914"&gt;Unauthorized tunnel creation access&lt;/P&gt;
&lt;/BLOCKQUOTE&gt;
&lt;P data-start="2916" data-end="2923"&gt;So run:&lt;/P&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;devtunnel user login&lt;/P&gt;
&lt;/BLOCKQUOTE&gt;
&lt;P data-start="2959" data-end="3039"&gt;A browser pops up&amp;nbsp; -&amp;gt; Sign in with the same Microsoft account used for your M365 Agent.&lt;/P&gt;
&lt;H3 data-start="3041" data-end="3075"&gt;Step 6.2 — Create the Tunnel&lt;/H3&gt;
&lt;P data-start="3077" data-end="3085"&gt;Now run:&lt;/P&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;devtunnel host -p 3978 --allow-anonymous&lt;/P&gt;
&lt;/BLOCKQUOTE&gt;
&lt;P data-start="3141" data-end="3178"&gt;You will get a public HTTPS URL like:&lt;BR /&gt;&lt;BR /&gt;&lt;/P&gt;
&lt;img /&gt;
&lt;P data-start="3319" data-end="3333"&gt;Copy this URL and we can test the bot in Azure bot service&lt;BR /&gt;&lt;BR /&gt;&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;H1 data-start="3340" data-end="3391"&gt;&lt;STRONG data-start="3344" data-end="3391"&gt;Step 7: Update the M365 Agent Endpoint in Portal&lt;/STRONG&gt;&lt;/H1&gt;
&lt;P data-start="3393" data-end="3444"&gt;Go to your Azure portal → ABS Agent → Settings → Endpoint URL&lt;BR data-start="3435" data-end="3438" /&gt;Paste: &amp;lt;tunnel-url&amp;gt;/api/messages&lt;/P&gt;
&lt;P data-start="3481" data-end="3496"&gt;Click &lt;STRONG data-start="3487" data-end="3495"&gt;Save&lt;/STRONG&gt;.&lt;/P&gt;
&lt;P data-start="3498" data-end="3512"&gt;At this point:&lt;/P&gt;
&lt;UL data-start="3513" data-end="3626"&gt;
&lt;LI data-start="3513" data-end="3546"&gt;Your Agent is running locally&lt;/LI&gt;
&lt;LI data-start="3547" data-end="3579"&gt;Your tunnel is publishing it&lt;/LI&gt;
&lt;LI data-start="3580" data-end="3626"&gt;You will be able to can talk to your Agent&lt;/LI&gt;
&lt;/UL&gt;
&lt;H1 data-start="3643" data-end="3688"&gt;&lt;STRONG data-start="3647" data-end="3688"&gt;Step 8: Test the Agent (The Fun Part)&lt;/STRONG&gt;&lt;/H1&gt;
&lt;P data-start="3690" data-end="3735"&gt;Go to your Azure bot service → &lt;STRONG data-start="3714" data-end="3734"&gt;Test in Web Chat&lt;/STRONG&gt;.&lt;/P&gt;
&lt;P data-start="3737" data-end="3742"&gt;Type:&lt;/P&gt;
&lt;P&gt;hello&lt;/P&gt;
&lt;P data-start="3759" data-end="3814"&gt;You should get back the card responses from the sample.&lt;/P&gt;
&lt;P data-start="3816" data-end="3916"&gt;If the sample sends Adaptive Cards or text messages, you will see them appear here exactly as coded.&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;H1 data-start="4317" data-end="4369"&gt;&lt;STRONG data-start="4321" data-end="4369"&gt;That's It! You Built Your First Python M365 Agent&lt;/STRONG&gt;&lt;/H1&gt;
&lt;P data-start="4371" data-end="4572"&gt;This guide took you from:&lt;BR /&gt;✔ VS Code setup&lt;BR data-start="4412" data-end="4415" /&gt;✔ Python environment extensions&lt;BR data-start="4446" data-end="4449" /&gt;✔ Cloning the sample&lt;BR data-start="4469" data-end="4472" /&gt;✔ Adding env configuration&lt;BR data-start="4498" data-end="4501" /&gt;✔ Running the Agent&lt;BR data-start="4520" data-end="4523" /&gt;✔ Creating a dev tunnel&lt;BR data-start="4546" data-end="4549" /&gt;✔ Testing in Web Chat&lt;/P&gt;
&lt;H1 data-start="4739" data-end="4752"&gt;Happy Learning!&lt;/H1&gt;</description>
      <pubDate>Wed, 01 Apr 2026 01:12:42 GMT</pubDate>
      <guid>https://techcommunity.microsoft.com/t5/iis-support-blog/let-s-create-our-first-microsoft-365-agent-sdk-using-python-for/ba-p/4472256</guid>
      <dc:creator>meenakshiBalekar</dc:creator>
      <dc:date>2026-04-01T01:12:42Z</dc:date>
    </item>
    <item>
      <title>Resolving Weak SSL Ciphers in .NET Framework 4.5</title>
      <link>https://techcommunity.microsoft.com/t5/iis-support-blog/resolving-weak-ssl-ciphers-in-net-framework-4-5/ba-p/4500709</link>
      <description>&lt;H3&gt;Symptom&lt;/H3&gt;
&lt;P&gt;Applications built on the .NET Framework 4.5 may fail to establish secure HTTPS connections or may default to outdated and insecure protocols. This can result in connection failures, browser security warnings, or rejection by modern APIs and services that require stronger encryption standards like TLS 1.2 or higher.&lt;/P&gt;
&lt;H3&gt;Cause&lt;/H3&gt;
&lt;P&gt;&lt;SPAN data-teams="true"&gt;.NET framework 4.5 is out of support and hence it does not use the latest cryptography mechanisms, we strongly recommend building apps in supported frameworks. Add the support lifecycle article there&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-teams="true"&gt;&lt;A href="https://dotnet.microsoft.com/en-us/platform/support/policy/dotnet-framework" target="_blank"&gt;.NET Framework official support policy | .NET&lt;/A&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;H3&gt;Resolution&lt;/H3&gt;
&lt;P&gt;The most robust fix is to upgrade your application to .NET Framework 4.6, 4.7 or later, where TLS 1.2 is enabled by default. This ensures your application uses stronger cipher suites and secure protocols automatically, without requiring additional configuration.&lt;/P&gt;
&lt;P&gt;After installing the newer .NET Framework on your development or production environment, update your project’s target framework and recompile. For ASP.NET applications, update your &lt;SPAN class="lia-text-color-15"&gt;Web.config&lt;/SPAN&gt; file to reflect the new framework version. For example, if upgrading to .NET 4.6:&lt;/P&gt;
&lt;P&gt;&lt;SPAN class="lia-text-color-8"&gt;&amp;nbsp; &amp;lt;system.web&amp;gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN class="lia-text-color-8"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;compilation targetFramework="4.6" /&amp;gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN class="lia-text-color-8"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;httpRuntime targetFramework="4.6" /&amp;gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN class="lia-text-color-8"&gt;&amp;nbsp; &amp;lt;/system.web&amp;gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;This change, along with rebuilding your application under the updated framework, ensures that IIS and the .NET runtime use the latest libraries. Once deployed, your application will negotiate HTTPS connections using TLS 1.2 by default, resolving issues related to weak or unsupported cipher protocols.&lt;/P&gt;</description>
      <pubDate>Wed, 01 Apr 2026 01:12:12 GMT</pubDate>
      <guid>https://techcommunity.microsoft.com/t5/iis-support-blog/resolving-weak-ssl-ciphers-in-net-framework-4-5/ba-p/4500709</guid>
      <dc:creator>Goyal_Sandeep</dc:creator>
      <dc:date>2026-04-01T01:12:12Z</dc:date>
    </item>
    <item>
      <title>Azure Bot Identity | Application with identifier 'x' was not found in the directory 'Bot Framework'</title>
      <link>https://techcommunity.microsoft.com/t5/iis-support-blog/azure-bot-identity-application-with-identifier-x-was-not-found/ba-p/4475227</link>
      <description>&lt;P&gt;TL;DR&lt;/P&gt;
&lt;UL&gt;
&lt;LI data-start="11" data-end="167"&gt;Every Azure Bot has a &lt;STRONG data-start="35" data-end="70"&gt;fixed identity (MicrosoftAppId)&lt;/STRONG&gt; tied to either an &lt;STRONG data-start="89" data-end="109"&gt;App Registration&lt;/STRONG&gt; or a &lt;STRONG data-start="115" data-end="135"&gt;Managed Identity&lt;/STRONG&gt;—it cannot be changed or reused.&lt;/LI&gt;
&lt;LI data-start="168" data-end="377"&gt;Azure Bot supports three identity types:
&lt;UL data-start="213" data-end="377"&gt;
&lt;LI data-start="213" data-end="249"&gt;&lt;STRONG data-start="215" data-end="249"&gt;User-Assigned Managed Identity&lt;/STRONG&gt;&lt;/LI&gt;
&lt;LI data-start="252" data-end="302"&gt;&lt;STRONG data-start="254" data-end="288"&gt;Single-Tenant App Registration&lt;/STRONG&gt;&lt;/LI&gt;
&lt;LI data-start="305" data-end="377"&gt;&lt;STRONG data-start="307" data-end="340"&gt;Multi-Tenant App Registration&lt;/STRONG&gt; (&lt;STRONG data-start="342" data-end="376" data-is-only-node=""&gt;deprecated after July 31, 2025&lt;/STRONG&gt;)&lt;/LI&gt;
&lt;/UL&gt;
&lt;/LI&gt;
&lt;LI data-start="378" data-end="581"&gt;Bots involve &lt;STRONG data-start="393" data-end="413"&gt;three auth flows&lt;/STRONG&gt;:
&lt;OL data-start="417" data-end="581"&gt;
&lt;LI data-start="417" data-end="458"&gt;Client → Channel (platform-specific)&lt;/LI&gt;
&lt;LI data-start="461" data-end="522"&gt;Channel ↔ Bot (core system auth using OAuth2 + Entra ID)&lt;/LI&gt;
&lt;LI data-start="525" data-end="581"&gt;User sign-in (optional; uses Authorization Code Flow)&lt;/LI&gt;
&lt;/OL&gt;
&lt;/LI&gt;
&lt;LI data-start="582" data-end="832"&gt;The error &lt;STRONG data-start="598" data-end="698"&gt;“AADSTS700016: Application with identifier 'xxx' was not found in the directory 'Bot Framework'” &lt;/STRONG&gt;happens when the Bot application tries to request tokens from the&amp;nbsp;&lt;STRONG data-start="773" data-end="800"&gt;botframework.com tenant&lt;/STRONG&gt; instead of its &lt;STRONG data-start="816" data-end="831"&gt;home tenant &lt;/STRONG&gt;while the App registration is set as SingleTenant.&lt;/LI&gt;
&lt;LI data-start="900" data-end="1031"&gt;&lt;A href="https://learn.microsoft.com/en-us/dotnet/api/microsoft.bot.builder.botframeworkadapter?view=botbuilder-dotnet-stable" target="_blank" rel="noopener"&gt;BotFrameworkAdapter Class (Microsoft.Bot.Builder) | Microsoft Learn&lt;/A&gt; is hardcoded to the Bot Framework tenant and &lt;STRONG data-start="969" data-end="986" data-is-only-node=""&gt;does not work&lt;/STRONG&gt; with Single-Tenant or Managed Identity bots. In Bot-Builder SDK (retires after Dec 2025), &lt;A href="https://learn.microsoft.com/en-us/dotnet/api/microsoft.bot.builder.integration.aspnet.core.cloudadapter?view=botbuilder-dotnet-stable" target="_blank" rel="noopener"&gt;CloudAdapter Class (Microsoft.Bot.Builder.Integration.AspNet.Core) | Microsoft Learn&lt;/A&gt; supports SingleTenant and UserAssigned-MSI bots and MicrosoftAppType needs to be configured to reflect the correct Bot Identity.&amp;nbsp;&lt;/LI&gt;
&lt;LI&gt;With announcement of the &lt;A class="lia-external-url" href="https://github.com/microsoft/botframework-sdk/tree/main" target="_blank" rel="noopener"&gt;Bot-Builder SDK deprecation&lt;/A&gt;, we recommend moving to The M365 &lt;A class="lia-external-url" href="https://learn.microsoft.com/en-us/microsoft-365/agents-sdk/agents-sdk-overview?tabs=csharp" target="_blank" rel="noopener"&gt;Agents SDK&lt;/A&gt; which retains many Bot Builder concepts with ability to create next generation Agents with orchestration, observability and more secure options authentication.&amp;nbsp; This also offers flexible and more secure options for token aquisition.&amp;nbsp;&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;&lt;SPAN data-teams="true"&gt;Skip directly to the "Channel (2) ↔ Bot (3) Authorization" section if you want to understand why the error occurs.&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;H2&gt;Azure Bot Identity&lt;/H2&gt;
&lt;P&gt;Every Azure Bot Service has a unique Id (also known as MSAAppId or MicrosoftAppId) which you can find in Azure Portal -&amp;gt; Azure Bot Resource -&amp;gt; Configuration if the Bot is created:&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;This MSAAppId corresponds to either the &lt;STRONG data-start="139" data-end="197"&gt;Client ID of&lt;/STRONG&gt;&amp;nbsp;&lt;A class="lia-external-url" href="https://learn.microsoft.com/en-us/entra/identity-platform/developer-glossary#application-registration" target="_blank" rel="noopener"&gt;Application Registration in Microsoft Entra ID&lt;/A&gt; or &lt;A class="lia-external-url" href="https://learn.microsoft.com/en-us/entra/identity/managed-identities-azure-resources/overview" target="_blank" rel="noopener"&gt;Managed Identity in Azure&lt;/A&gt; . This is Id is tied to the respective Bot Service from creation until deletion, cannot be modified or reused for a different Bot resource. Closely related to this is the concept of the &lt;STRONG data-start="472" data-end="499"&gt;Azure Bot Identity Type &lt;/STRONG&gt;and can be one of the following:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;User-assigned managed identity - identity tied to a &lt;A href="https://learn.microsoft.com/en-us/entra/identity/managed-identities-azure-resources/overview" target="_blank" rel="noopener"&gt;Managed Identity in Azure&lt;/A&gt;&lt;/LI&gt;
&lt;LI&gt;Single-tenant - identity tied to an&amp;nbsp;&lt;A href="https://learn.microsoft.com/en-us/entra/identity-platform/developer-glossary#application-registration" target="_blank" rel="noopener"&gt;Application Registration in Microsoft Entra ID&lt;/A&gt; with Supported account types = Accounts in this organizational directory only
&lt;UL&gt;
&lt;LI&gt;Reference -&lt;STRONG&gt;&amp;nbsp;&lt;A href="https://learn.microsoft.com/en-us/entra/identity-platform/quickstart-register-app#register-an-application" target="_blank" rel="noopener"&gt;How to register an app in Microsoft Entra ID - Microsoft identity platform | Microsoft Learn&lt;/A&gt;&lt;/STRONG&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;/LI&gt;
&lt;LI&gt;Multi-Tenant&amp;nbsp;&lt;EM&gt;(Deprecated – ends July 31, 2025) - &lt;/EM&gt;identity tied to an&amp;nbsp;&lt;A href="https://learn.microsoft.com/en-us/entra/identity-platform/developer-glossary#application-registration" target="_blank" rel="noopener"&gt;Application Registration in Microsoft Entra ID&lt;/A&gt; with Supported account types = Accounts in any organizational directory
&lt;UL&gt;
&lt;LI&gt;Reference - &lt;A href="https://learn.microsoft.com/en-us/entra/identity-platform/developer-glossary#multitenant-application" target="_blank" rel="noopener"&gt;Microsoft Identity Platform Glossary - Microsoft identity platform | Microsoft Learn&lt;/A&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;References:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;A href="https://learn.microsoft.com/en-us/azure/bot-service/abs-quickstart?view=azure-bot-service-4.0&amp;amp;tabs=userassigned#bot-identity-information" target="_blank" rel="noopener"&gt;Create an Azure Bot resource in the Azure portal - Bot Service | Microsoft Learn&lt;/A&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;H2&gt;Identity and Authorization&lt;/H2&gt;
&lt;P&gt;As described in &lt;A href="https://techcommunity.microsoft.com/blog/iis-support-blog/navigating-azure-bot-networking-key-considerations-for-privatization/4284592?previewMessage=true" target="_blank" rel="noopener"&gt;Navigating Azure Bot Networking: Key Considerations for Privatization, &lt;/A&gt;an Azure Bot Solution consists of below components:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG&gt;Clients (1)&lt;/STRONG&gt;: User-facing application used to consume/converse with Bot solutions. Examples include&amp;nbsp;&lt;A href="https://github.com/microsoft/BotFramework-WebChat/tree/main" target="_blank" rel="noopener"&gt;Web Chat Widget&lt;/A&gt;, Teams, Slack etc.&amp;nbsp;&amp;nbsp;&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;The Bot Service&lt;/STRONG&gt;: This managed SaaS umbrella includes configuration management, channel services and token services. Services are made available with the&amp;nbsp;&amp;lt;service&amp;gt;.botframework.com&amp;nbsp;endpoints.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;The Bot Application (2)&lt;/STRONG&gt;: Using the Bot/Agents SDK or Composer, you create an HTTP-based application that encapsulates your functional and conversational logic, including recognition, processing, and storage. The Bot application operates using the&amp;nbsp;&lt;A href="https://github.com/microsoft/botframework-sdk/blob/main/specs/botframework-activity/botframework-activity.md" target="_blank" rel="noopener"&gt;Bot Framework Activity Specification&lt;/A&gt;. The Bot application exposes a public messaging endpoint for receiving activities (messaging endpoint).&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Channel Connectors (3): &lt;/STRONG&gt;While Azure Bot Service provides two native channels—Direct Line and Web Chat—it is designed to be highly extensible and supports integration with additional clients and communication platforms through external channels. These channels are implemented and operated by their respective providers and run within their own managed data centers. The bot’s messaging endpoint is not exposed directly to end users; instead, users interact with the bot via channel connectors, which handle session management, activity routing, and authentication on behalf of the client. Different clients, such as Teams and Slack, represent messages and activities uniquely. Since Bot applications understands and responds with activities as defined in the&amp;nbsp;&lt;A href="https://github.com/microsoft/botframework-sdk/blob/main/specs/botframework-activity/botframework-activity.md" target="_blank" rel="noopener"&gt;Bot Framework Activity Specification&lt;/A&gt;, channels are responsible for transforming activities and forwarding them to the application.&lt;/LI&gt;
&lt;/UL&gt;
&lt;img /&gt;
&lt;P&gt;There are 3 Authentication/Authorization flows in a Bot solution.&amp;nbsp;&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG&gt;Client (1) to Channel (2) Authentication&lt;/STRONG&gt; - This flow is &lt;STRONG data-start="416" data-end="437"&gt;platform-specific&lt;/STRONG&gt; and is implemented by the channel owner. It governs how an end-user or client application authenticates with the channel before any interaction reaches the bot. For example, the&amp;nbsp;&lt;STRONG data-start="618" data-end="633"&gt;Direct Line&lt;/STRONG&gt; channel requires a token or secret to establish trust, as described in &lt;A href="https://learn.microsoft.com/en-us/azure/bot-service/rest-api/bot-framework-rest-direct-line-3-0-authentication?view=azure-bot-service-4.0" target="_blank" rel="noopener"&gt;Direct Line Authentication in Azure AI Bot Service - Bot Service | Microsoft Learn&lt;/A&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Channel (2) &amp;lt;-&amp;gt; Bot&amp;nbsp;(3) Authorization&lt;/STRONG&gt;&amp;nbsp;- This flow is&amp;nbsp;&lt;STRONG style="color: rgb(30, 30, 30);" data-start="951" data-end="974"&gt;channel-independent&lt;/STRONG&gt;&lt;SPAN style="color: rgb(30, 30, 30);"&gt; and is consistent across all Azure Bot channels. Communication between the channel and the bot occurs via bi-directional HTTPS calls secured using &lt;/SPAN&gt;&lt;A href="https://learn.microsoft.com/en-us/entra/identity-platform/developer-glossary#access-token" target="_blank" rel="noopener"&gt;OAuth2 JWT Access Tokens&lt;/A&gt; &lt;STRONG style="color: rgb(30, 30, 30);" data-start="1122" data-end="1182"&gt;issued by Microsoft Entra ID&lt;/STRONG&gt;&lt;SPAN style="color: rgb(30, 30, 30);"&gt;. &lt;/SPAN&gt;Both the channel and the bot validate each other by exchanging these tokens. This mechanism is what directly relies on the&amp;nbsp;&lt;STRONG style="color: rgb(30, 30, 30);" data-start="1460" data-end="1487"&gt;Azure Bot Identity type&lt;/STRONG&gt;&lt;SPAN style="color: rgb(30, 30, 30);"&gt; (Managed Identity, Single-Tenant App, or legacy Multi-Tenant App) and is the primary focus of this blog.&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI&gt;
&lt;P data-start="1414" data-end="1592"&gt;&lt;SPAN style="color: rgb(30, 30, 30);"&gt;&lt;STRONG&gt;User Authentication&lt;/STRONG&gt; - &lt;/SPAN&gt;This is an optional flow enables end users to authenticate within the chat experience so the bot can i&lt;SPAN style="color: rgb(30, 30, 30);"&gt;dentify the user, a&lt;/SPAN&gt;ccess protected user data or perform actions on the user’s behalf (e.g., schedule meetings, access emails). User authentication is implemented using the &lt;SPAN style="color: rgb(30, 30, 30);"&gt;"&lt;/SPAN&gt;&lt;A class="lia-external-url" style="background-color: rgb(255, 255, 255); font-style: normal; font-weight: 400;" href="https://learn.microsoft.com/en-us/entra/identity-platform/v2-oauth2-auth-code-flow" target="_blank" rel="noopener"&gt;Authorization Code Flow&lt;/A&gt;&lt;SPAN style="color: rgb(30, 30, 30);"&gt;" and supports multiple identity providers, including &lt;STRONG data-start="1993" data-end="2015"&gt;Microsoft Entra ID&lt;/STRONG&gt;. When Entra ID is used, the bot can authenticate users using the &lt;STRONG data-start="2086" data-end="2111"&gt;same App Registration&lt;/STRONG&gt; as the bot identity, or a &lt;STRONG data-start="2142" data-end="2171"&gt;separate App Registration&lt;/STRONG&gt;, depending on security and design requirements. This user sign-in process is &lt;STRONG data-start="2249" data-end="2264"&gt;independent&lt;/STRONG&gt; of the Channel-to-Bot authorization flow and is not affected by the bot’s identity type.&lt;/SPAN&gt;&lt;/P&gt;
&lt;/LI&gt;
&lt;/UL&gt;
&lt;UL&gt;
&lt;LI style="list-style-type: none;"&gt;
&lt;UL&gt;
&lt;LI&gt;References:
&lt;UL&gt;
&lt;LI&gt;&lt;A href="https://learn.microsoft.com/en-us/azure/bot-service/bot-builder-authentication?view=azure-bot-service-4.0&amp;amp;tabs=userassigned%2Caadv2%2Ccsharp" target="_blank" rel="noopener"&gt;Add authentication to a bot in Bot Framework SDK - Bot Service | Microsoft Learn&lt;/A&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;A class="lia-external-url" style="font-style: normal; font-weight: 400; background-color: rgb(255, 255, 255);" href="https://github.com/microsoft/botframework-sdk/tree/main/docs/umlDiagrams/Authentication#detailed-view" target="_blank" rel="noopener"&gt;Flow Diagram - botframework-sdk&lt;/A&gt; - In a brief:
&lt;UL&gt;
&lt;LI&gt;The Bot application checks whether a user access token already exists in the &lt;STRONG data-start="244" data-end="269"&gt;Azure Bot Token Store&lt;/STRONG&gt;.&lt;/LI&gt;
&lt;LI&gt;If no token is found, the bot challenges the user to sign in within the chat interface. Some channels, such as &lt;STRONG data-start="387" data-end="406"&gt;Microsoft Teams&lt;/STRONG&gt;, also support SSO - &lt;A href="https://learn.microsoft.com/en-us/microsoftteams/platform/bots/how-to/authentication/bot-sso-overview?tabs=personal" target="_blank" rel="noopener"&gt;Enable SSO with Microsoft Entra ID - Teams | Microsoft Learn&lt;/A&gt;&lt;/LI&gt;
&lt;LI&gt;The issued token is then securely stored in the &lt;STRONG data-start="634" data-end="659"&gt;Azure Bot Token Store&lt;/STRONG&gt;.&lt;/LI&gt;
&lt;LI&gt;The user is redirected to the configured &lt;STRONG data-start="493" data-end="514"&gt;Identity Provider&lt;/STRONG&gt; (for example, Microsoft Entra ID) and authenticates successfully.&lt;/LI&gt;
&lt;LI&gt;The Bot application retrieves the token from the Token Store and uses it to access protected resources or perform actions on the user’s behalf.&lt;/LI&gt;
&lt;/UL&gt;
&lt;/LI&gt;
&lt;/UL&gt;
&lt;/LI&gt;
&lt;/UL&gt;
&lt;/LI&gt;
&lt;/UL&gt;
&lt;H2&gt;Channel (2) &amp;lt;-&amp;gt; Bot (3) Authorization&lt;/H2&gt;
&lt;img /&gt;
&lt;P&gt;As we see in the "Outbound Flow: Bot to Channel", the Bot Application typically uses &lt;A href="https://learn.microsoft.com/en-us/entra/identity-platform/v2-oauth2-client-creds-grant-flow" target="_blank" rel="noopener"&gt;OAuth 2.0 client credentials flow on the Microsoft identity platform - Microsoft identity platform | Microsoft Learn&lt;/A&gt;. The &lt;STRONG data-start="385" data-end="415"&gt;token authority (endpoint)&lt;/STRONG&gt; used for this flow depends on the &lt;STRONG data-start="450" data-end="471"&gt;Bot Identity Type&lt;/STRONG&gt;, as documented in&lt;A href="https://learn.microsoft.com/en-us/azure/bot-service/rest-api/bot-framework-rest-connector-authentication?view=azure-bot-service-4.0&amp;amp;tabs=multitenant#step-1-request-an-access-token-from-the-microsoft-entra-id-account-login-service" target="_blank" rel="noopener"&gt; Authenticate requests with the Bot Connector API - Bot Service | Microsoft Learn&lt;/A&gt;.&lt;/P&gt;
&lt;P&gt;The error "Application with identifier 'xxx' was not found in the directory 'Bot Framework'" happens when:&lt;/P&gt;
&lt;UL&gt;
&lt;LI data-start="722" data-end="876"&gt;The Bot’s Application Registration is configured as &lt;STRONG data-start="776" data-end="793"&gt;Single-Tenant&lt;/STRONG&gt;&lt;BR data-start="793" data-end="796" /&gt;&lt;EM data-start="798" data-end="874"&gt;(Supported account types = Accounts in this organizational directory only)&lt;/EM&gt;&lt;/LI&gt;
&lt;LI data-start="877" data-end="1035"&gt;The Bot application requests a token from the &lt;STRONG data-start="925" data-end="949"&gt;Bot Framework tenant&lt;/STRONG&gt;:
&lt;UL&gt;
&lt;LI&gt;https://login.microsoftonline.com/botframework.com/oauth2/v2.0/token&lt;/LI&gt;
&lt;/UL&gt;
&lt;/LI&gt;
&lt;LI data-start="1036" data-end="1125"&gt;Since the App Registration is &lt;STRONG data-start="1068" data-end="1085"&gt;Single-Tenant&lt;/STRONG&gt;, only the home tenant can issue tokens.&lt;/LI&gt;
&lt;LI data-start="1126" data-end="1199"&gt;The Bot Framework tenant is not the home tenant → token issuance fails.&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;All the operations shown in diagram except business logic is automatically handled by the SDK (BotSDK or AgentsSDK) but the Developer gets control correct token endpoint.&amp;nbsp;&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;Bot SDK automatically infers the token endpoint/Authority based on the configuration:
&lt;UL&gt;
&lt;LI&gt;If you are using&amp;nbsp;&lt;A href="https://learn.microsoft.com/en-us/dotnet/api/microsoft.bot.builder.botframeworkadapter?view=botbuilder-dotnet-stable" target="_blank" rel="noopener"&gt;BotFrameworkAdapter Class (Microsoft.Bot.Builder) | Microsoft Learn&lt;/A&gt; - it will always make calls to "https://login.microsoftonline.com/&lt;STRONG&gt;botframework.com&lt;/STRONG&gt;/oauth2/v2.0/token". Thus, it cannot work with SingleTenant or UserAssigned MSI Bot.&amp;nbsp;&lt;/LI&gt;
&lt;LI&gt;If you are using &lt;A href="https://learn.microsoft.com/en-us/dotnet/api/microsoft.bot.builder.integration.aspnet.core.cloudadapter?view=botbuilder-dotnet-stable" target="_blank" rel="noopener"&gt;CloudAdapter Class (Microsoft.Bot.Builder.Integration.AspNet.Core) | Microsoft Learn&lt;/A&gt;, it supports configuring the Bot Identity using the MicrosoftAppType. Review samples to understand how this is configured for different runtimes:
&lt;UL&gt;
&lt;LI&gt;&lt;A href="https://github.com/microsoft/BotBuilder-Samples/tree/main/samples" target="_blank" rel="noopener"&gt;BotBuilder-Samples/samples at main · microsoft/BotBuilder-Samples · GitHub&lt;/A&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;A href="https://github.com/microsoft/BotBuilder-Samples/blob/main/samples/csharp_dotnetcore/02.echo-bot/appsettings.json" target="_blank" rel="noopener"&gt;BotBuilder-Samples/samples/csharp_dotnetcore/02.echo-bot/appsettings.json at main · microsoft/BotBuilder-Samples · GitHub&lt;/A&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;/LI&gt;
&lt;/UL&gt;
&lt;/LI&gt;
&lt;LI&gt;M365 Agents SDK - This is a successor of Bot SDK and will be the only supported SDK after December 2025:
&lt;UL&gt;
&lt;LI&gt;The Identity configuration is flexible and simplified in Agents SDK. The concepts remain same, appropriate token endpoint/authority needs to be used.
&lt;UL&gt;
&lt;LI&gt;&lt;A href="https://learn.microsoft.com/en-us/microsoft-365/agents-sdk/microsoft-authentication-library-configuration-options" target="_blank" rel="noopener"&gt;Configure authentication in a .NET agent | Microsoft Learn&lt;/A&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;A href="https://github.com/microsoft/Agents/tree/main/samples" target="_blank" rel="noopener"&gt;Agents/samples at main · microsoft/Agents · GitHub&lt;/A&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;/LI&gt;
&lt;/UL&gt;
&lt;/LI&gt;
&lt;/UL&gt;
&lt;H2&gt;Migration from&lt;SPAN style="color: rgb(30, 30, 30);"&gt;MultiTenant &lt;/SPAN&gt;SingleTenant to in the Bot code:&lt;/H2&gt;
&lt;UL&gt;
&lt;LI&gt;With announcement of the Bot-Builder SDK deprecation, we recommend moving to Agents SDK which retains many Bot Builder concepts with ability to create next generation Agents with orchestration, observability and more secure options authentication.&amp;nbsp; &amp;nbsp;
&lt;UL&gt;
&lt;LI&gt;&lt;A href="https://github.com/microsoft/botframework-sdk/tree/main" target="_blank" rel="noopener"&gt;GitHub - microsoft/botframework-sdk: Bot Framework provides the most comprehensive experience for building conversation applications.&lt;/A&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;A href="https://learn.microsoft.com/en-us/microsoft-365/agents-sdk/bf-migration-guidance" target="_blank" rel="noopener"&gt;Azure Bot Framework SDK to Microsoft 365 Agents SDK migration guidance | Microsoft Learn&lt;/A&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;/LI&gt;
&lt;LI&gt;For Bot SDK to work with SingleTenant, you must use &lt;A href="https://learn.microsoft.com/en-us/dotnet/api/microsoft.bot.builder.integration.aspnet.core.cloudadapter?view=botbuilder-dotnet-stable" target="_blank" rel="noopener"&gt;CloudAdapter Class (Microsoft.Bot.Builder.Integration.AspNet.Core) | Microsoft Learn&lt;/A&gt; and configure correct MicrosoftAppType.&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;I hope it helps.&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Fri, 05 Dec 2025 14:42:50 GMT</pubDate>
      <guid>https://techcommunity.microsoft.com/t5/iis-support-blog/azure-bot-identity-application-with-identifier-x-was-not-found/ba-p/4475227</guid>
      <dc:creator>manojdixit</dc:creator>
      <dc:date>2025-12-05T14:42:50Z</dc:date>
    </item>
    <item>
      <title>Addressing .Net EOL installations for Windows Admins</title>
      <link>https://techcommunity.microsoft.com/t5/iis-support-blog/addressing-net-eol-installations-for-windows-admins/ba-p/4473750</link>
      <description>&lt;BLOCKQUOTE&gt;
&lt;P&gt;TL; DR:&lt;/P&gt;
&lt;P data-start="125" data-end="500"&gt;Installing the latest .NET runtime on a server &lt;STRONG data-start="172" data-end="214"&gt;does not upgrade existing applications&lt;/STRONG&gt; that are built on unsupported versions (for example, anything older than .NET 8 as of Nov 2025). Applications must be explicitly upgraded through a full development lifecycle—retargeting the project to a supported framework, updating dependencies, rebuilding, testing, and redeploying.&lt;/P&gt;
&lt;P data-start="502" data-end="757"&gt;This is not something a Windows administrator can safely perform alone. However, admins &lt;EM data-start="590" data-end="606"&gt;can and should&lt;/EM&gt; identify which applications are running on EOL .NET versions and coordinate with development teams to ensure they are upgraded to a supported release.&lt;/P&gt;
&lt;/BLOCKQUOTE&gt;
&lt;H3 data-start="183" data-end="239"&gt;.NET vs .NET Framework: Understanding the Difference&lt;/H3&gt;
&lt;P data-start="241" data-end="557"&gt;Unlike the classic &lt;STRONG data-start="260" data-end="278"&gt;.NET Framework&lt;/STRONG&gt;, modern &lt;STRONG data-start="287" data-end="316"&gt;.NET (formerly .NET Core)&lt;/STRONG&gt; is &lt;EM data-start="320" data-end="325"&gt;not&lt;/EM&gt; an integral part of the Windows operating system. It is typically installed &lt;STRONG data-start="402" data-end="415"&gt;on-demand&lt;/STRONG&gt; when an application requires it. This means multiple .NET versions can coexist on the same system without automatically affecting each other.&lt;/P&gt;
&lt;P data-start="559" data-end="574"&gt;Modern .NET is:&lt;/P&gt;
&lt;UL data-start="575" data-end="695"&gt;
&lt;LI data-start="575" data-end="617"&gt;Cross-platform (Windows, Linux, macOS)&lt;/LI&gt;
&lt;LI data-start="618" data-end="633"&gt;Open source&lt;/LI&gt;
&lt;LI data-start="634" data-end="695"&gt;Designed for rapid evolution and cloud-native development&lt;/LI&gt;
&lt;/UL&gt;
&lt;P data-start="697" data-end="814"&gt;Because of these design goals, modern .NET follows a &lt;STRONG data-start="750" data-end="782"&gt;fixed annual release cadence&lt;/STRONG&gt; with defined support timelines.&lt;/P&gt;
&lt;P data-start="697" data-end="814"&gt;Official documentation:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;A href="https://dotnet.microsoft.com/en-us/platform/support/policy/dotnet-core" target="_blank"&gt;.NET and .NET Core official support policy | .NET&lt;/A&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;A href="https://dotnet.microsoft.com/en-us/platform/support/policy/dotnet-framework" target="_blank"&gt;.NET Framework official support policy | .NET&lt;/A&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;A href="https://dotnet.microsoft.com/en-us/download" target="_blank"&gt;Download .NET (Linux, macOS, and Windows) | .NET&lt;/A&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;H3 data-start="1521" data-end="1542"&gt;End of Life (EOL)&lt;/H3&gt;
&lt;P data-start="1544" data-end="1705"&gt;As a .NET version approaches End of Life (EOL), Microsoft recommends upgrading to a supported version and reducing dependency on the expiring runtime. After EOL:&lt;/P&gt;
&lt;UL data-start="1707" data-end="1820"&gt;
&lt;LI data-start="1707" data-end="1730"&gt;Security updates stop&lt;/LI&gt;
&lt;LI data-start="1731" data-end="1747"&gt;Bug fixes stop&lt;/LI&gt;
&lt;LI data-start="1748" data-end="1782"&gt;Microsoft technical support ends&lt;/LI&gt;
&lt;LI data-start="1783" data-end="1820"&gt;Compliance and audit risks increase&lt;/LI&gt;
&lt;/UL&gt;
&lt;P data-start="1822" data-end="1891"&gt;Microsoft strongly discourages continued use of unsupported runtimes:&lt;/P&gt;
&lt;P data-start="1895" data-end="2035"&gt;Using out-of-support .NET versions may expose your applications, data, and environment to security vulnerabilities and operational failures.&lt;/P&gt;
&lt;P data-start="2037" data-end="2089"&gt;EOL is also referred to as &lt;STRONG data-start="2064" data-end="2088"&gt;End of Support (EOS)&lt;/STRONG&gt;.&lt;/P&gt;
&lt;H3 data-start="2096" data-end="2146"&gt;Why Security Tools Flag EOL .NET Installations&lt;/H3&gt;
&lt;P data-start="2148" data-end="2387"&gt;Once a .NET runtime reaches EOL, vulnerability scanners and endpoint security software often flag it as a risk and recommend removal. Even if your tools do not explicitly report it, &lt;STRONG data-start="2330" data-end="2386"&gt;proactive removal and upgrade is still best practice&lt;/STRONG&gt;.&lt;/P&gt;
&lt;P data-start="2389" data-end="2448"&gt;Before uninstalling, however, administrators typically ask:&lt;/P&gt;
&lt;UL data-start="2450" data-end="2666"&gt;
&lt;LI data-start="2450" data-end="2497"&gt;&lt;EM data-start="2452" data-end="2495"&gt;What will break if I remove this version?&lt;/EM&gt;&lt;/LI&gt;
&lt;LI data-start="2498" data-end="2553"&gt;&lt;EM data-start="2500" data-end="2551"&gt;Can I just install the latest .NET to replace it?&lt;/EM&gt;&lt;/LI&gt;
&lt;LI data-start="2554" data-end="2609"&gt;&lt;EM data-start="2556" data-end="2607"&gt;Which applications are dependent on this runtime?&lt;/EM&gt;&lt;/LI&gt;
&lt;LI data-start="2610" data-end="2666"&gt;&lt;EM data-start="2612" data-end="2666"&gt;Can I safely remove it if nothing appears to use it?&lt;/EM&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;Here is a general workflow that can be used to address the above questions:&lt;/P&gt;
&lt;H3&gt;Step 1 – Identify Applications Using EOL ASP.NET / .NET Runtimes&lt;/H3&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;&lt;STRONG data-start="235" data-end="249"&gt;Important:&lt;/STRONG&gt; The steps below identify only the applications &lt;EM data-start="297" data-end="340"&gt;actively running at the time of execution&lt;/EM&gt;. Any dormant services, scheduled tasks, or rarely used applications may still depend on EOL .NET but will not appear until they are executed.&lt;/P&gt;
&lt;/BLOCKQUOTE&gt;
&lt;UL&gt;
&lt;LI&gt;
&lt;P data-start="484" data-end="613"&gt;To identify currently running applications that are using the .NET runtime, you can use &lt;STRONG data-start="572" data-end="597"&gt;Sysinternals ListDLLs&lt;/STRONG&gt; from Microsoft.&lt;/P&gt;
&lt;/LI&gt;
&lt;LI&gt;
&lt;P data-start="484" data-end="613"&gt;Download&amp;nbsp;&lt;A href="https://learn.microsoft.com/en-us/sysinternals/downloads/listdlls" target="_blank"&gt;ListDLLs - Sysinternals | Microsoft Learn&lt;/A&gt; and run the following command from an elevated (Administrator) CMD prompt:&lt;/P&gt;
&lt;/LI&gt;
&lt;/UL&gt;
&lt;LI-CODE lang="powershell"&gt;listdlls.exe -d coreclr.dll -accepteula -v&lt;/LI-CODE&gt;&lt;img&gt;Sample output of listdll command&lt;/img&gt;
&lt;P&gt;This will show all the dotnet processes (with versions 6/7 or 8 or previous) along with version of .Net runtime loaded (coreclr). Make a note of processes that are loading EOL .Net versions - &lt;A href="https://dotnet.microsoft.com/en-us/platform/support/policy/dotnet-core" target="_blank"&gt;.NET and .NET Core official support policy.&amp;nbsp;&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;Note - coreclr is the Dotnet runtime dll which will be loaded in a .Net process. The listdll shows a specific version loaded by respective process, that would help identify processes using EOL .Net runtime.&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;Reference - &lt;A href="https://devblogs.microsoft.com/dotnet/coreclr-is-now-open-source/" target="_blank"&gt;CoreCLR is now Open Source - .NET Blog&lt;/A&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;H2&gt;Step 2 - Reach to the developers to upgrade the Application to supported version:&amp;nbsp;&lt;/H2&gt;
&lt;UL&gt;
&lt;LI&gt;
&lt;P data-start="183" data-end="414"&gt;Applications&amp;nbsp;&lt;STRONG data-start="196" data-end="228"&gt;do not automatically upgrade&lt;/STRONG&gt; to a newer .NET version simply because a supported runtime is installed on the server. Each application must be &lt;STRONG data-start="341" data-end="367"&gt;rebuilt and retargeted&lt;/STRONG&gt; to explicitly use the newer framework version.&lt;/P&gt;
&lt;/LI&gt;
&lt;LI&gt;
&lt;P data-start="183" data-end="414"&gt;The upgrade process typically follows a full software development lifecycle (SDLC), including:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;Retargeting the project to the latest supported .NET version&lt;/LI&gt;
&lt;LI&gt;
&lt;P data-start="183" data-end="414"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Updating NuGet packages and dependencies&lt;/P&gt;
&lt;/LI&gt;
&lt;LI data-start="621" data-end="648"&gt;Fixing breaking changes&lt;/LI&gt;
&lt;LI data-start="649" data-end="679"&gt;Rebuilding the application&lt;/LI&gt;
&lt;LI data-start="680" data-end="717"&gt;Functional and regression testing&lt;/LI&gt;
&lt;LI data-start="718" data-end="746"&gt;Deployment to production&lt;/LI&gt;
&lt;/UL&gt;
&lt;/LI&gt;
&lt;LI&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P data-start="748" data-end="1064"&gt;This process is &lt;STRONG data-start="764" data-end="830"&gt;not something a Windows administrator can safely perform alone&lt;/STRONG&gt;. It requires access to the application source code and ownership from the development or product team. Administrators should focus on identifying incompatible or EOL runtimes and coordinating with application owners to plan upgrades.&lt;/P&gt;
&lt;/LI&gt;
&lt;LI&gt;Reference:
&lt;UL&gt;
&lt;LI&gt;&lt;A href="https://learn.microsoft.com/en-us/dotnet/core/install/upgrade" target="_blank"&gt;Upgrade to a new .NET version - .NET | Microsoft Learn&lt;/A&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;/LI&gt;
&lt;/UL&gt;
&lt;H2 data-start="92" data-end="155"&gt;Step 3 – Confirm No Applications Are Using EOL .NET Runtimes&lt;/H2&gt;
&lt;P data-start="157" data-end="308"&gt;After application owners have upgraded and deployments are completed, you must verify that no processes are still running on unsupported .NET runtimes.&lt;/P&gt;
&lt;P data-start="310" data-end="372"&gt;Repeat the same process from &lt;STRONG data-start="339" data-end="349"&gt;Step 1&lt;/STRONG&gt; to re-scan the system:&lt;/P&gt;
&lt;H2 data-start="152" data-end="200"&gt;Step 4 – Uninstall / Remove EOL .NET Runtimes&lt;/H2&gt;
&lt;UL&gt;
&lt;LI&gt;Once you confirmed no dependency on the EOL products you can proceed with uninstall.&lt;/LI&gt;
&lt;LI&gt;Note that .Net apps can be &lt;STRONG&gt;self-contained or&amp;nbsp;framework-dependent:&lt;/STRONG&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;A href="https://learn.microsoft.com/en-us/dotnet/core/deploying/?pivots=visualstudio#publishing-modes" target="_blank"&gt;.NET application publishing overview - .NET | Microsoft Learn&lt;/A&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Publish self-contained&lt;/STRONG&gt;&lt;BR /&gt;This mode produces a publishing folder that includes a platform-specific executable used to start the app, a compiled binary containing app code, any app dependencies, and the .NET runtime required to run the app. The environment that runs the app doesn't need to have the .NET runtime preinstalled.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Publish framework-dependent&lt;/STRONG&gt;&lt;BR /&gt;This mode produces a publishing folder that includes an optional platform-specific executable used to start the app, a compiled binary containing app code, and any app dependencies. The environment that runs the app must have a version of the .NET runtime installed that the app can use.
&lt;UL&gt;
&lt;LI&gt;Framework dependant apps will use the shared runtimes that you may have installed from &lt;A href="https://dotnet.microsoft.com/en-us/download" target="_blank"&gt;Download .NET (Linux, macOS, and Windows) | .NET&lt;/A&gt;.&lt;/LI&gt;
&lt;/UL&gt;
&lt;/LI&gt;
&lt;LI&gt;&amp;nbsp;For self-contained apps, the developer must provide a latest package with supported runtimes.&amp;nbsp;&lt;/LI&gt;
&lt;/UL&gt;
&lt;/LI&gt;
&lt;LI&gt;Of course, to anticipate failure, please have back up/recovery plans and execute the actions during a downtime as per your company policies.&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;I hope this helps.&amp;nbsp;&lt;BR /&gt;&lt;BR /&gt;&lt;/P&gt;</description>
      <pubDate>Fri, 28 Nov 2025 13:53:53 GMT</pubDate>
      <guid>https://techcommunity.microsoft.com/t5/iis-support-blog/addressing-net-eol-installations-for-windows-admins/ba-p/4473750</guid>
      <dc:creator>manojdixit</dc:creator>
      <dc:date>2025-11-28T13:53:53Z</dc:date>
    </item>
    <item>
      <title>Why Does an Old Certificate Reappear After Reboot in Azure VMs?</title>
      <link>https://techcommunity.microsoft.com/t5/iis-support-blog/why-does-an-old-certificate-reappear-after-reboot-in-azure-vms/ba-p/4465209</link>
      <description>&lt;H2&gt;&lt;STRONG&gt;Issue Observed&lt;/STRONG&gt;&lt;/H2&gt;
&lt;P&gt;A customer removed an expired SSL certificate from their Azure VM after installing a renewed one. However, after every reboot, the old certificate reappeared, and IIS site bindings automatically started picking it up.&lt;/P&gt;
&lt;H2&gt;&lt;STRONG&gt;Investigation Steps&lt;/STRONG&gt;&lt;/H2&gt;
&lt;H3&gt;&lt;STRONG&gt;1. Identify the Process Bringing Back the Certificate&lt;/STRONG&gt;&lt;/H3&gt;
&lt;P&gt;To trace the root cause, we configured &lt;STRONG&gt;Sysmon&lt;/STRONG&gt; following this guide:&lt;BR /&gt;&lt;EM&gt;&lt;A href="https://techcommunity.microsoft.com/blog/iis-support-blog/auditing-scenarios-for-web-application-hosted-in-iis---part-1---ssl-binding-modi/3730761" target="_blank" rel="noopener"&gt;Auditing Scenarios for Web Application Hosted in IIS - Part 1 - SSL Binding Modified | Microsoft Community Hub&lt;/A&gt;&lt;/EM&gt;&lt;/P&gt;
&lt;P&gt;We asked the customer to remove the certificate and reboot the server to reproduce the issue.&lt;BR /&gt;After rebooting, the certificate was reinstalled. Event logs revealed a process named &lt;STRONG&gt;akvvm_service.exe&lt;/STRONG&gt; was responsible for bringing the certificate back.&lt;/P&gt;
&lt;P&gt;Following is the screenshot from the event log:&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;I then checked the task manager to check about the process (7964) and see following:&lt;/P&gt;
&lt;img /&gt;
&lt;H3&gt;&lt;STRONG&gt;2. What is akvvm_service.exe?&lt;/STRONG&gt;&lt;/H3&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG&gt;akvvm_service.exe&lt;/STRONG&gt; is the service executable for the &lt;STRONG&gt;Azure Key Vault VM extension&lt;/STRONG&gt;.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Purpose of this service:&lt;/STRONG&gt;
&lt;UL&gt;
&lt;LI&gt;Monitors certificates stored in &lt;STRONG&gt;Azure Key Vault&lt;/STRONG&gt; that the VM is configured to observe.&lt;/LI&gt;
&lt;LI&gt;Automatically downloads, installs, and refreshes those certificates into the Windows certificate store (e.g., LocalMachine\My) at a defined polling interval:
&lt;UL&gt;
&lt;LI&gt;&lt;A href="https://learn.microsoft.com/en-us/azure/virtual-machines/extensions/key-vault-windows" target="_blank" rel="noopener"&gt;Azure Key Vault VM extension for Windows - Azure Virtual Machines | Microsoft Learn&lt;/A&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;/LI&gt;
&lt;/UL&gt;
&lt;/LI&gt;
&lt;/UL&gt;
&lt;H3&gt;&lt;STRONG&gt;3. Why Was This Happening?&lt;/STRONG&gt;&lt;/H3&gt;
&lt;P&gt;The customer had multiple certificates in their Key Vault. The VM extension KeyVaultForWindows was pulling all configured certificates back into the server during every reboot.&lt;/P&gt;
&lt;P&gt;To check the extensions:&lt;BR /&gt;Go to Azure VM -&amp;gt; Search for Extensions -&amp;gt; Select Extensions + applications:&lt;/P&gt;
&lt;P&gt;We see all the Extensions + applications configured with the VM and here we see this extension KeyVaultForWindows configured:&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;Further checks revealed:&lt;/P&gt;
&lt;P&gt;Issue was only happening in DEV, TEST and STG environment and not in PROD&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG&gt;DEV, TEST, and STG environments&lt;/STRONG&gt; had the &lt;STRONG&gt;KeyVaultForWindows&lt;/STRONG&gt; extension installed.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;PROD environment&lt;/STRONG&gt; did &lt;STRONG&gt;not&lt;/STRONG&gt; have this extension, which explained why the issue was isolated to non-PROD environments.&lt;/LI&gt;
&lt;/UL&gt;
&lt;H2&gt;&lt;STRONG&gt;Resolution&lt;/STRONG&gt;&lt;/H2&gt;
&lt;P&gt;We shared the following action plan:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG&gt;Option 1:&lt;/STRONG&gt; Uninstall the Key Vault VM extension to match the PROD setup.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Option 2:&lt;/STRONG&gt; Delete or disable certificates that are no longer required in Key Vault.&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;The customer chose &lt;STRONG&gt;Option 2&lt;/STRONG&gt; and confirmed:&lt;/P&gt;
&lt;P&gt;“Disabling expired certificates within Key Vault fixed the issue.”&lt;/P&gt;
&lt;H2&gt;&lt;STRONG&gt;Key Takeaways&lt;/STRONG&gt;&lt;/H2&gt;
&lt;UL&gt;
&lt;LI&gt;If old certificates reappear after reboot, check for &lt;STRONG&gt;Azure Key Vault VM extension&lt;/STRONG&gt;.&lt;/LI&gt;
&lt;LI&gt;This extension automatically syncs certificates from Key Vault to your VM.&lt;/LI&gt;
&lt;LI&gt;To prevent unwanted certificates:
&lt;UL&gt;
&lt;LI&gt;Remove the extension if not needed.&lt;/LI&gt;
&lt;LI&gt;Or disable/delete unnecessary certificates in Key Vault.&lt;/LI&gt;
&lt;/UL&gt;
&lt;/LI&gt;
&lt;/UL&gt;</description>
      <pubDate>Wed, 29 Oct 2025 16:02:22 GMT</pubDate>
      <guid>https://techcommunity.microsoft.com/t5/iis-support-blog/why-does-an-old-certificate-reappear-after-reboot-in-azure-vms/ba-p/4465209</guid>
      <dc:creator>Shekhar</dc:creator>
      <dc:date>2025-10-29T16:02:22Z</dc:date>
    </item>
    <item>
      <title>Troubleshooting File Upload Error: 413 Request Body Too Large in .NET Core</title>
      <link>https://techcommunity.microsoft.com/t5/iis-support-blog/troubleshooting-file-upload-error-413-request-body-too-large-in/ba-p/4420818</link>
      <description>&lt;P&gt;&lt;STRONG&gt;Troubleshooting File Upload Error: 413 Request Body Too Large in .NET Core&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;When working with file uploads in .NET Core, you might encounter the 413 "Request Body Too Large" error even if the maxAllowedContentLength value in your web.config file is correctly set. This issue can be perplexing, especially when all configurations seem to be in place. In this blog, we will explore a common cause of this error related to the ASPNETCORE_TEMP environment variable and how to resolve it.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Understanding the Issue&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;The 413 error indicates that the request body size exceeds the server's configured limit. Typically, this is controlled by the maxAllowedContentLength setting in the web.config file. However, if the ASPNETCORE_TEMP environment variable is incorrectly set, it can lead to this error despite having the correct maxAllowedContentLength value.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Scenario&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;Let's consider a scenario where the maxAllowedContentLength in the web.config file is set to 50 MB, but the application still throws a 413 error for files larger than 10 MB. Upon investigation, it is found that the ASPNETCORE_TEMP environment variable is incorrectly configured in the launchSettings.json file.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Steps to Resolve the Issue&lt;/STRONG&gt;&lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;&lt;STRONG&gt;Verify maxAllowedContentLength in web.config&lt;/STRONG&gt;: Ensure that the maxAllowedContentLength value in your web.config file is correctly set according to your requirements. For example:&lt;/LI&gt;
&lt;/OL&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp; &amp;lt;system.webServer&amp;gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;security&amp;gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;requestFiltering&amp;gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;requestLimits maxAllowedContentLength="52428800" /&amp;gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/requestFiltering&amp;gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/security&amp;gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp; &amp;lt;/system.webServer&amp;gt;&lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;&lt;STRONG&gt;Check ASPNETCORE_TEMP Environment Variable&lt;/STRONG&gt;: The ASPNETCORE_TEMP environment variable specifies the location where ASP.NET Core stores temporary files, such as those used for buffering large request bodies. If this variable is incorrectly set, it can cause the 413 error.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Update launchSettings.json&lt;/STRONG&gt;: Ensure that the ASPNETCORE_TEMP environment variable is correctly configured in the launchSettings.json file. Here is an example of how to set it:&lt;/LI&gt;
&lt;/OL&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp; {&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; "profiles": {&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; "IIS Express": {&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; "commandName": "IISExpress",&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; "launchBrowser": true,&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; "environmentVariables": {&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; "ASPNETCORE_ENVIRONMENT": "Development",&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;"ASPNETCORE_TEMP": "C:\\Temp\\ASPNETCORE"&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; },&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; "YourProjectName": {&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; "commandName": "Project",&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; "dotnetRunMessages": true,&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; "launchBrowser": true,&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; "applicationUrl": "&lt;A href="https://localhost:5001;http:/localhost:5000" target="_blank"&gt;https://localhost:5001;http://localhost:5000&lt;/A&gt;",&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; "environmentVariables": {&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; "ASPNETCORE_ENVIRONMENT": "Development",&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; "ASPNETCORE_TEMP": "C:\\Temp\\ASPNETCORE"&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp; }&lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;&lt;STRONG&gt;Verify the Temporary Directory&lt;/STRONG&gt;: Ensure that the directory specified in the ASPNETCORE_TEMP environment variable exists and has the necessary permissions for the application to write temporary files.&lt;/LI&gt;
&lt;/OL&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Example Case&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;In a recent support case, the maxAllowedContentLength was set to 50 MB in the web.config file, but the application was still throwing a 413 error for files larger than 10 MB. Upon checking, it was found that the ASPNETCORE_TEMP environment variable was set to an incorrect path in the launchSettings.json file. Correcting the path resolved the issue.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Conclusion&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;By ensuring that the ASPNETCORE_TEMP environment variable is correctly set and the maxAllowedContentLength value in the web.config file is appropriate, you can resolve the 413 "Request Body Too Large" error in your .NET Core application. Proper configuration of these settings ensures smooth handling of large file uploads without encountering size-related errors.&lt;/P&gt;
&lt;P&gt;If you have any further questions or need additional assistance, feel free to reach out!&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Tue, 02 Sep 2025 16:25:30 GMT</pubDate>
      <guid>https://techcommunity.microsoft.com/t5/iis-support-blog/troubleshooting-file-upload-error-413-request-body-too-large-in/ba-p/4420818</guid>
      <dc:creator>Goyal_Sandeep</dc:creator>
      <dc:date>2025-09-02T16:25:30Z</dc:date>
    </item>
    <item>
      <title>Enabling Client Certificate Authentication for an Application Inside Default Web Site</title>
      <link>https://techcommunity.microsoft.com/t5/iis-support-blog/enabling-client-certificate-authentication-for-an-application/ba-p/4420820</link>
      <description>&lt;P&gt;&lt;STRONG&gt;Enabling Client Certificate Authentication for an Application Inside Default Web Site&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;In this blog, we will explore how to enable client certificate authentication for a specific application hosted inside the Web Site in IIS, while keeping client certificate authentication disabled at the Web Site level. This configuration is useful when you want to secure only a particular application with client certificates, without affecting the entire site.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Understanding the Scenario&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;Imagine you have a Web Site in IIS that hosts multiple applications. You want to enable client certificate authentication for one specific application, but not for the entire Web Site. This setup ensures that only the designated application requires client certificates for access, while the rest of the site remains accessible without this additional layer of security.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Step-by-Step Configuration&lt;/STRONG&gt;&lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;&lt;STRONG&gt;Install IIS Client Certificate Mapping Authentication&lt;/STRONG&gt;:&lt;/LI&gt;
&lt;UL&gt;
&lt;LI&gt;Open &lt;STRONG&gt;Server Manager&lt;/STRONG&gt;.&lt;/LI&gt;
&lt;LI&gt;Click on &lt;STRONG&gt;Manage&lt;/STRONG&gt; and then &lt;STRONG&gt;Add Roles and Features&lt;/STRONG&gt;.&lt;/LI&gt;
&lt;LI&gt;In the &lt;STRONG&gt;Add Roles and Features Wizard&lt;/STRONG&gt;, click &lt;STRONG&gt;Next&lt;/STRONG&gt; until you reach the &lt;STRONG&gt;Server Roles&lt;/STRONG&gt; page.&lt;/LI&gt;
&lt;LI&gt;Expand &lt;STRONG&gt;Web Server (IIS)&lt;/STRONG&gt;, then &lt;STRONG&gt;Web Server&lt;/STRONG&gt;, then &lt;STRONG&gt;Security&lt;/STRONG&gt;.&lt;/LI&gt;
&lt;LI&gt;Select &lt;STRONG&gt;IIS Client Certificate Mapping Authentication&lt;/STRONG&gt; and click &lt;STRONG&gt;Next&lt;/STRONG&gt;.&lt;/LI&gt;
&lt;LI&gt;Complete the wizard and click &lt;STRONG&gt;Install&lt;/STRONG&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;LI&gt;&lt;STRONG&gt;Configure SSL Settings at the Application Level&lt;/STRONG&gt;:&lt;/LI&gt;
&lt;UL&gt;
&lt;LI&gt;Launch &lt;STRONG&gt;IIS Manager&lt;/STRONG&gt; and navigate to your Default Web Site.&lt;/LI&gt;
&lt;LI&gt;Select the specific application for which you want to enable client certificate authentication.&lt;/LI&gt;
&lt;LI&gt;In the &lt;STRONG&gt;Features View&lt;/STRONG&gt;, double-click on &lt;STRONG&gt;SSL Settings&lt;/STRONG&gt;.&lt;/LI&gt;
&lt;LI&gt;Check &lt;STRONG&gt;Require SSL&lt;/STRONG&gt; and &lt;STRONG&gt;Require&lt;/STRONG&gt; under &lt;STRONG&gt;Client Certificates&lt;/STRONG&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;LI&gt;&lt;STRONG&gt;Disable Client Certificate Authentication at the Web Site Level&lt;/STRONG&gt;:&lt;/LI&gt;
&lt;UL&gt;
&lt;LI&gt;In &lt;STRONG&gt;IIS Manager&lt;/STRONG&gt;, select the Default Web Site.&lt;/LI&gt;
&lt;LI&gt;Go to &lt;STRONG&gt;SSL Settings&lt;/STRONG&gt;.&lt;/LI&gt;
&lt;LI&gt;Ensure that &lt;STRONG&gt;Require SSL&lt;/STRONG&gt; and &lt;STRONG&gt;Client Certificates&lt;/STRONG&gt; are not checked&lt;/LI&gt;
&lt;/UL&gt;
&lt;LI&gt;&lt;STRONG&gt;Configure Client Certificate Mapping Authentication&lt;/STRONG&gt;:&lt;/LI&gt;
&lt;UL&gt;
&lt;LI&gt;Select the specific application in &lt;STRONG&gt;IIS Manager&lt;/STRONG&gt;.&lt;/LI&gt;
&lt;LI&gt;In the &lt;STRONG&gt;Features View&lt;/STRONG&gt;, select &lt;STRONG&gt;Configuration Editor&lt;/STRONG&gt; under the &lt;STRONG&gt;Management&lt;/STRONG&gt; section.&lt;/LI&gt;
&lt;LI&gt;Navigate to system.webServer/security/authentication/iisClientCertificateMappingAuthentication.&lt;/LI&gt;
&lt;LI&gt;Set the &lt;STRONG&gt;enabled&lt;/STRONG&gt; field to true.&lt;/LI&gt;
&lt;LI&gt;Set the &lt;STRONG&gt;oneToOneCertificateMappingsEnabled&lt;/STRONG&gt; property to true.&lt;/LI&gt;
&lt;LI&gt;Click on &lt;STRONG&gt;Edit Items&lt;/STRONG&gt; under the &lt;STRONG&gt;oneToOneMappings&lt;/STRONG&gt; property.&lt;/LI&gt;
&lt;LI&gt;Add a new mapping by providing the BLOB of the client certificate&lt;/LI&gt;
&lt;/UL&gt;
&lt;/OL&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Common Mistakes and Solutions&lt;/STRONG&gt;&lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;&lt;STRONG&gt;Configuring at the Sub-Application Level&lt;/STRONG&gt;:&lt;/LI&gt;
&lt;UL&gt;
&lt;LI&gt;A common mistake is configuring client certificate authentication at the sub-application level. This approach does not work as expected and should be avoided. Instead, configure it at the server and site level to ensure proper authentication&lt;/LI&gt;
&lt;/UL&gt;
&lt;LI&gt;&lt;STRONG&gt;Fallback Mechanism Issue&lt;/STRONG&gt;:&lt;/LI&gt;
&lt;UL&gt;
&lt;LI&gt;Ensure that all other authentication methods are disabled for the application that requires client certificate authentication. This prevents fallback mechanisms from allowing access without the correct certificate.&lt;/LI&gt;
&lt;/UL&gt;
&lt;/OL&gt;
&lt;P&gt;&lt;STRONG&gt;Conclusion&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;By following these steps, you can successfully enable client certificate authentication for a specific application within the Default Web Site in IIS. This configuration ensures that only the designated application requires client certificates for access, while the rest of the site remains accessible without this additional layer of security. If you encounter any issues or need further assistance, feel free to reach out.&lt;/P&gt;</description>
      <pubDate>Tue, 02 Sep 2025 16:25:14 GMT</pubDate>
      <guid>https://techcommunity.microsoft.com/t5/iis-support-blog/enabling-client-certificate-authentication-for-an-application/ba-p/4420820</guid>
      <dc:creator>Goyal_Sandeep</dc:creator>
      <dc:date>2025-09-02T16:25:14Z</dc:date>
    </item>
    <item>
      <title>Identifying and Blocking Python-httpx Requests</title>
      <link>https://techcommunity.microsoft.com/t5/iis-support-blog/identifying-and-blocking-python-httpx-requests/ba-p/4420827</link>
      <description>&lt;P&gt;&lt;STRONG&gt;Introduction&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;In today’s API-driven world, automated scripts—especially those using Python libraries like httpx—can pose a risk if left unchecked. While many of these scripts are legitimate, some are used for scraping, brute-force attacks, or unauthorised data access. This blog explores how to detect and block such requests using IIS features like the &lt;STRONG&gt;URL Rewrite Module&lt;/STRONG&gt; and &lt;STRONG&gt;Request Filtering&lt;/STRONG&gt;.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Identifying Python-httpx Requests&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;The first step is detection. We identified Python scripts accessing APIs by analysing &lt;STRONG&gt;IIS logs&lt;/STRONG&gt;, particularly the &lt;STRONG&gt;User-Agent&lt;/STRONG&gt; field. Suspicious entries like "&lt;STRONG&gt;Python httpx&lt;/STRONG&gt;" indicated automated access attempts.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Blocking with URL Rewrite Module&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;The &lt;STRONG&gt;URL Rewrite Module&lt;/STRONG&gt; in IIS allows you to create inbound rules based on request headers. Here's how to block requests from httpx:&lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;Open IIS Manager and navigate to your site.&lt;/LI&gt;
&lt;LI&gt;Open the &lt;STRONG&gt;URL Rewrite&lt;/STRONG&gt; module.&lt;/LI&gt;
&lt;LI&gt;Add a new &lt;STRONG&gt;Inbound Rule&lt;/STRONG&gt;.&lt;/LI&gt;
&lt;LI&gt;Set the condition:&lt;/LI&gt;
&lt;UL&gt;
&lt;LI&gt;Input: {HTTP_USER_AGENT}&lt;/LI&gt;
&lt;LI&gt;Check if it &lt;STRONG&gt;Matches the Pattern&lt;/STRONG&gt;: .*httpx.*&lt;/LI&gt;
&lt;/UL&gt;
&lt;LI&gt;Set the action to &lt;STRONG&gt;Abort Request&lt;/STRONG&gt; or return a &lt;STRONG&gt;custom status code&lt;/STRONG&gt; like 404.&lt;/LI&gt;
&lt;/OL&gt;
&lt;P&gt;This method is flexible—you can customise the response code or redirect the request.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Blocking with Request Filtering&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;As an alternative, &lt;STRONG&gt;Request Filtering&lt;/STRONG&gt; offers a simpler but less flexible approach:&lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;Open &lt;STRONG&gt;Request Filtering&lt;/STRONG&gt; in IIS.&lt;/LI&gt;
&lt;LI&gt;Go to the &lt;STRONG&gt;HTTP Verbs&lt;/STRONG&gt; or &lt;STRONG&gt;Headers&lt;/STRONG&gt; tab.&lt;/LI&gt;
&lt;LI&gt;Add a rule to &lt;STRONG&gt;deny requests&lt;/STRONG&gt; where the User-Agent contains httpx.&lt;/LI&gt;
&lt;/OL&gt;
&lt;P&gt;When tested, this method returned a 400 status code, effectively blocking the script.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Testing the Block&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;Here’s a simple Python script using httpx to test your rules:&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;&lt;U&gt;Testing Script&lt;/U&gt;&lt;/STRONG&gt;&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;Create a new Python file and give it any name (for example, &lt;STRONG&gt;TestPython.py&lt;/STRONG&gt;).&lt;/LI&gt;
&lt;LI&gt;Copy and paste the following content into that file.&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;&lt;SPAN class="lia-text-color-13"&gt;import httpx&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN class="lia-text-color-13"&gt;response = httpx.get('http://localhost/test.htm')&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN class="lia-text-color-13"&gt;print(response.status_code)&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;&lt;U&gt;Testing Method&lt;/U&gt;&lt;/STRONG&gt;&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;Open the Command Prompt.&lt;/LI&gt;
&lt;LI&gt;Navigate to the directory where the test Python script is located.&lt;/LI&gt;
&lt;LI&gt;Run the following command:&lt;/LI&gt;
&lt;UL&gt;
&lt;LI style="font-weight: bold;"&gt;&lt;STRONG&gt;&lt;SPAN class="lia-text-color-13"&gt;python TestPython.py&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;/UL&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;When accessed ('&lt;SPAN class="lia-text-color-13"&gt;http://localhost/test.htm&lt;/SPAN&gt;') via a browser: 200 OK&lt;/LI&gt;
&lt;LI&gt;When accessed via script: 403, 404, or 400 depending on your configuration&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Choosing Between Methods&lt;/STRONG&gt;&lt;/P&gt;
&lt;DIV class="styles_lia-table-wrapper__h6Xo9 styles_table-responsive__MW0lN"&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;Feature&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;URL Rewrite Module&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;Request Filtering&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;Custom Status Codes&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;✅ Yes&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;❌ No&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/DIV&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Conclusion&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;Blocking automated httpx requests is essential for protecting your APIs from misuse. IIS provides robust tools to help you do this effectively. Whether you prefer the flexibility of URL Rewrite or the simplicity of Request Filtering, both methods can be tailored to your security needs.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Tue, 02 Sep 2025 16:24:57 GMT</pubDate>
      <guid>https://techcommunity.microsoft.com/t5/iis-support-blog/identifying-and-blocking-python-httpx-requests/ba-p/4420827</guid>
      <dc:creator>Goyal_Sandeep</dc:creator>
      <dc:date>2025-09-02T16:24:57Z</dc:date>
    </item>
    <item>
      <title>Troubleshooting SSL Certificate Issues in Reverse Proxy</title>
      <link>https://techcommunity.microsoft.com/t5/iis-support-blog/troubleshooting-ssl-certificate-issues-in-reverse-proxy/ba-p/4420840</link>
      <description>&lt;P&gt;&lt;STRONG&gt;Introduction&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;Reverse proxies are essential in modern web architectures, especially for isolating backend services and enforcing security. However, SSL certificate issues can introduce complex challenges, particularly when dealing with HTTPS-only bindings, self-signed certificates, or organisational constraints. This blog shares practical insights from real-world troubleshooting, lab simulations, and customer scenarios.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Reverse Proxy Configuration: HTTP vs HTTPS Bindings&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;HTTP Binding Setup&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;In one scenario, I configured a reverse proxy for a backend site using HTTP binding on a custom port (e.g., 82). This setup is straightforward and avoids SSL complications. The reverse proxy helps prevent direct public access to the backend server, enhancing security.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;HTTPS Binding Challenges&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;When the backend site is configured with only HTTPS binding (e.g., port 49494), the reverse proxy must validate the SSL certificate. This introduces challenges, especially with self-signed or privately issued certificates. In such cases, clients may encounter 502.3 - Bad Gateway errors due to failed certificate validation.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;&amp;nbsp;&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Certificate Issues and Solutions&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Certificate Warnings&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;Accessing the reverse proxy site over HTTPS often led to browser warnings due to untrusted certificates. This is common when the backend uses a self-signed certificate or one issued by a private CA.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Solution 1: Root Certificate Installation&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;Installing the backend server’s root certificate on the reverse proxy server resolved the warning. This approach is secure and recommended for production environments.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Solution 2: Registry Change (Temporary)&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;For testing or constrained environments, I used a registry key to bypass certificate validation:&lt;/P&gt;
&lt;P&gt;[HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\IIS Extensions\\Application Request Routing\\Parameters]&lt;/P&gt;
&lt;P&gt;"SecureConnectionIgnoreFlags"=dword:00003100&lt;/P&gt;
&lt;P&gt;⚠️ This is a temporary workaround and should not be used in production due to security risks.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Troubleshooting Tips&lt;/STRONG&gt;&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;Always verify the backend URL directly from the proxy server.&lt;/LI&gt;
&lt;LI&gt;Use freb logs to identify SSL handshake failures.&lt;/LI&gt;
&lt;LI&gt;Monitor for 502.3 errors and correlate with certificate validation logs.&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;&lt;STRONG&gt;Lab Setup Guide&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Prerequisites&lt;/STRONG&gt;&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;Reverse Proxy Server (Windows Server)&lt;/LI&gt;
&lt;LI&gt;Backend Server (Windows Server)&lt;/LI&gt;
&lt;LI&gt;Client Machine (Windows 10/11)&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;&lt;STRONG&gt;Backend Server&lt;/STRONG&gt;&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;Create a website with HTTP (e.g. port 82) and HTTPS (e.g. port 49494) bindings.&lt;/LI&gt;
&lt;LI&gt;Use self-signed or test certificates for HTTPS.&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;&lt;STRONG&gt;Reverse Proxy Server&lt;/STRONG&gt;&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;Configure URL rewrite rules for both HTTP and HTTPS.&lt;/LI&gt;
&lt;LI&gt;Test access to backend URLs from the proxy server.&lt;/LI&gt;
&lt;LI&gt;Import root certificates or apply registry changes as needed.&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;&lt;STRONG&gt;Client Machine&lt;/STRONG&gt;&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;Access the reverse proxy URL and validate connectivity.&lt;/LI&gt;
&lt;LI&gt;Observe browser behaviour and error messages.&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Conclusion&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;SSL certificate issues in reverse proxy setups can be complex but manageable with the right approach. Whether you're dealing with HTTP/HTTPS bindings, self-signed certificates, or organisational constraints, understanding the root cause and applying targeted solutions is key. Collaboration, testing, and documentation are your best allies.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Tue, 02 Sep 2025 16:24:40 GMT</pubDate>
      <guid>https://techcommunity.microsoft.com/t5/iis-support-blog/troubleshooting-ssl-certificate-issues-in-reverse-proxy/ba-p/4420840</guid>
      <dc:creator>Goyal_Sandeep</dc:creator>
      <dc:date>2025-09-02T16:24:40Z</dc:date>
    </item>
    <item>
      <title>Troubleshooting IIS Admin Service Termination: “Invalid Signature” Error</title>
      <link>https://techcommunity.microsoft.com/t5/iis-support-blog/troubleshooting-iis-admin-service-termination-invalid-signature/ba-p/4422347</link>
      <description>&lt;P&gt;&lt;STRONG&gt;🔍&lt;/STRONG&gt;&lt;STRONG&gt; Overview&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;If you've encountered the following error in your Windows Event Viewer:&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;“The IIS Admin Service service terminated with the following service-specific error: Invalid Signature”&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;you're likely dealing with a cryptographic issue affecting the IIS metabase. This blog post walks you through the root causes, diagnostics, and step-by-step resolutions to restore service functionality.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;🧠&lt;/STRONG&gt;&lt;STRONG&gt; What Causes This Error?&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;This error typically appears as &lt;STRONG&gt;Event ID 7024&lt;/STRONG&gt; and is often triggered by:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;Corruption or deletion of the &lt;STRONG&gt;machine key&lt;/STRONG&gt; used by IIS.&lt;/LI&gt;
&lt;LI&gt;Improper SSL certificate updates.&lt;/LI&gt;
&lt;LI&gt;Misconfigured permissions on cryptographic folders.&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;The IIS Admin Service relies on a secure machine key (usually a file starting with c23) stored in:&lt;/P&gt;
&lt;P&gt;C:\ProgramData\Microsoft\Crypto\RSA\MachineKeys&lt;/P&gt;
&lt;P&gt;If this key is missing or invalid, IIS cannot decrypt its configuration, resulting in the “Invalid Signature” error.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;🧪&lt;/STRONG&gt;&lt;STRONG&gt; Diagnostic Steps&lt;/STRONG&gt;&lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;&lt;STRONG&gt;Check Event Viewer&lt;/STRONG&gt;&lt;BR /&gt;Look for Event ID 7024 under System logs.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Verify Machine Key Presence&lt;/STRONG&gt;&lt;BR /&gt;Navigate to the MachineKeys folder and check for a file starting with c23.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Audit Permissions&lt;/STRONG&gt;&lt;BR /&gt;Ensure SYSTEM and Administrators have &lt;STRONG&gt;Full Control&lt;/STRONG&gt; on the MachineKeys folder.&lt;/LI&gt;
&lt;/OL&gt;
&lt;P&gt;&lt;STRONG&gt;🛠️&lt;/STRONG&gt;&lt;STRONG&gt; Resolution Steps&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;✅&lt;/STRONG&gt;&lt;STRONG&gt; Option 1: Restore from Backup&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;If you have a backup of the c23* file:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;Replace the corrupted file.&lt;/LI&gt;
&lt;LI&gt;Restart the IIS Admin Service.&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;&lt;STRONG&gt;🔄&lt;/STRONG&gt;&lt;STRONG&gt; Option 2: Reinstall IIS 6 Metabase Compatibility&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;If no backup is available:&lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;Delete the corrupted c23* file.&lt;/LI&gt;
&lt;LI&gt;Open &lt;STRONG&gt;Server Manager&lt;/STRONG&gt; → &lt;STRONG&gt;Manage Optional Features&lt;/STRONG&gt;.&lt;/LI&gt;
&lt;LI&gt;Uninstall &lt;STRONG&gt;IIS 6 Metabase Compatibility&lt;/STRONG&gt;.&lt;/LI&gt;
&lt;LI&gt;Reboot the server.&lt;/LI&gt;
&lt;LI&gt;Reinstall the feature to regenerate the machine key.&lt;/LI&gt;
&lt;/OL&gt;
&lt;P&gt;&lt;STRONG&gt;🔐&lt;/STRONG&gt;&lt;STRONG&gt; Option 3: Reset Permissions&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;Ensure the following permissions on C:\ProgramData\Microsoft\Crypto\RSA\MachineKeys:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;SYSTEM: Full Control&lt;/LI&gt;
&lt;LI&gt;Administrators: Full Control&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;&lt;STRONG&gt;💡&lt;/STRONG&gt;&lt;STRONG&gt; Pro Tips&lt;/STRONG&gt;&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;Always back up the MachineKeys folder before making changes.&lt;/LI&gt;
&lt;LI&gt;Consider enabling &lt;STRONG&gt;IIS Configuration Backup&lt;/STRONG&gt; for future recovery.&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Tue, 02 Sep 2025 16:23:56 GMT</pubDate>
      <guid>https://techcommunity.microsoft.com/t5/iis-support-blog/troubleshooting-iis-admin-service-termination-invalid-signature/ba-p/4422347</guid>
      <dc:creator>Goyal_Sandeep</dc:creator>
      <dc:date>2025-09-02T16:23:56Z</dc:date>
    </item>
    <item>
      <title>Capture .NET Memory Dump on Linux</title>
      <link>https://techcommunity.microsoft.com/t5/iis-support-blog/capture-net-memory-dump-on-linux/ba-p/4401935</link>
      <description>&lt;P&gt;Collecting memory dumps is a crucial part of diagnosing and troubleshooting application issues on Linux machines. Microsoft suggests three primary tools for this purpose: dotnet-dump, procdump, and createdump. In this blog post, we will explore these tools, provide the commands needed to use them, and offer a summary to understand their significance better.&lt;/P&gt;
&lt;H1&gt;1. Methods to Collect Memory Dumps on Linux&lt;/H1&gt;
&lt;H2&gt;&lt;STRONG&gt;dotnet-dump&lt;/STRONG&gt;&lt;/H2&gt;
&lt;P&gt;The dotnet-dump tool is a part of the .NET SDK and can be used to collect and analyze dumps. It allows you to capture a dump file from a running .NET application without needing to install additional debugging tools.&lt;BR /&gt;&lt;BR /&gt;&lt;A href="https://learn.microsoft.com/en-us/dotnet/core/diagnostics/dotnet-dump" target="_blank" rel="noopener"&gt;https://learn.microsoft.com/en-us/dotnet/core/diagnostics/dotnet-dump&lt;/A&gt; &lt;BR /&gt;&lt;BR /&gt;&lt;/P&gt;
&lt;H2&gt;&lt;STRONG&gt;procdump&lt;/STRONG&gt;&lt;/H2&gt;
&lt;P&gt;Procdump is a versatile tool provided by Microsoft that captures dumps based on various triggers, such as high CPU usage or unhandled exceptions. Originally built for Windows, it has been ported to Linux, offering similar functionalities.&lt;BR /&gt;&lt;BR /&gt;&lt;A href="https://github.com/microsoft/ProcDump-for-Linux" target="_blank" rel="noopener"&gt;https://github.com/microsoft/ProcDump-for-Linux&lt;/A&gt;&lt;/P&gt;
&lt;H2&gt;&lt;STRONG&gt;createdump&lt;/STRONG&gt;&lt;/H2&gt;
&lt;P&gt;The createdump utility is specifically designed for .NET Core applications. It creates core dumps that can be used for post-mortem debugging when an application crashes.&lt;BR /&gt;&lt;BR /&gt;&lt;A href="https://learn.microsoft.com/en-us/troubleshoot/developer/webapps/aspnetcore/practice-troubleshoot-linux/lab-1-3-capture-core-crash-dumps#configure-createdump-to-run-at-process-termination" target="_blank" rel="noopener"&gt;https://learn.microsoft.com/en-us/troubleshoot/developer/webapps/aspnetcore/practice-troubleshoot-linux/lab-1-3-capture-core-crash-dumps#configure-createdump-to-run-at-process-termination&lt;/A&gt;&lt;/P&gt;
&lt;H1&gt;2. Command for dotnet-dump&lt;/H1&gt;
&lt;P&gt;To collect a memory dump using dotnet-dump, you can execute the following command:&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;LI-CODE lang="powershell"&gt;./dotnet-dump collect -p &amp;lt;ProcessID&amp;gt;&lt;/LI-CODE&gt;
&lt;P&gt;&lt;BR /&gt;&lt;BR /&gt;In case you want to collect dump on crash you can use below :&lt;BR /&gt;&lt;BR /&gt;&lt;/P&gt;
&lt;LI-CODE lang="powershell"&gt;./dotnet-dump collect -p &amp;lt;ProcessID&amp;gt; -Crashreport &lt;/LI-CODE&gt;
&lt;P&gt;&lt;BR /&gt;&lt;BR /&gt;Here, replace&amp;nbsp;&amp;nbsp; with the ID of the process you want to dump.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;H1&gt;3. Command for procdump&lt;/H1&gt;
&lt;P&gt;To capture a dump with procdump, use the command:&lt;/P&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;sudo procdump -p &amp;lt;PID&amp;gt; -n 3 - s 10&lt;/P&gt;
&lt;P&gt;sudo procdump -C &amp;lt;CPU_Usage&amp;gt; -M &amp;lt;Memory_Usage&amp;gt; &amp;lt;PID&amp;gt; -n 3 - s 10&lt;/P&gt;
&lt;/BLOCKQUOTE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;In this example, the tool will create a dump if the CPU usage exceeds a certain threshold over three consecutive 10-second intervals. Adjust the parameters as needed for your specific scenario.&lt;/P&gt;
&lt;H1&gt;4. Command for createdump&lt;/H1&gt;
&lt;P&gt;To generate a dump using createdump, the command is:&lt;/P&gt;
&lt;LI-CODE lang="powershell"&gt;sudo createdump --full &amp;lt;PID&amp;gt;&lt;/LI-CODE&gt;
&lt;P&gt;Replace&amp;nbsp;&amp;nbsp; with the appropriate process ID.&lt;/P&gt;
&lt;H1&gt;Summary&lt;/H1&gt;
&lt;P&gt;Collecting memory dumps is essential for diagnosing application issues on Linux. Microsoft provides three recommended tools: dotnet-dump, procdump, and createdump. Each of these tools offers unique functionalities to help capture detailed information about your applications' state at the time of issues. By utilizing the respective commands for each tool, you can efficiently collect memory dumps and troubleshoot more effectively.&lt;BR /&gt;&lt;BR /&gt;&lt;/P&gt;
&lt;P&gt;The commands for capturing memory dumps are straightforward:&lt;/P&gt;
&lt;BLOCKQUOTE&gt;
&lt;UL&gt;
&lt;LI&gt;dotnet-dump: dotnet-dump collect -p&lt;/LI&gt;
&lt;LI&gt;procdump: procdump -p -s 10 -n 3&lt;/LI&gt;
&lt;LI&gt;createdump: createdump --full &amp;lt;PID&amp;gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;/BLOCKQUOTE&gt;
&lt;P&gt;By following these steps, you can ensure that you have the necessary data to analyze and resolve issues efficiently. Memory dump collection is a valuable skill for any Linux system administrator or developer, and mastering these tools will significantly enhance your troubleshooting capabilities.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Tue, 02 Sep 2025 16:23:35 GMT</pubDate>
      <guid>https://techcommunity.microsoft.com/t5/iis-support-blog/capture-net-memory-dump-on-linux/ba-p/4401935</guid>
      <dc:creator>meenakshiBalekar</dc:creator>
      <dc:date>2025-09-02T16:23:35Z</dc:date>
    </item>
    <item>
      <title>Customizing Temporary File Paths in ASP.NET Applications</title>
      <link>https://techcommunity.microsoft.com/t5/iis-support-blog/customizing-temporary-file-paths-in-asp-net-applications/ba-p/4411172</link>
      <description>&lt;P&gt;&lt;STRONG&gt;Issue:&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;In ASP.NET applications, temporary files are generated during compilation and runtime. By default, these files are stored in system directory at:&amp;nbsp; &lt;STRONG&gt;C:\Windows\Microsoft.NET\Framework[64]\&amp;lt;version&amp;gt;\Temporary ASP.NET Files\.&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;These ASP.NET temporary files include:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG&gt;Compiled assemblies&lt;/STRONG&gt;&amp;nbsp;(DLLs) of your web pages, user controls, and other server-side code.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Cached versions&lt;/STRONG&gt;&amp;nbsp;of resources like Razor views (.cshtml), Web Forms (.aspx), and other dynamic content.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Intermediate files&lt;/STRONG&gt; used during the build and runtime process.&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;This can lead to the following issues:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;Running out of space on the system drive (C:)&lt;/LI&gt;
&lt;LI&gt;Difficulty in managing or monitoring temp files&lt;/LI&gt;
&lt;LI&gt;Performance bottlenecks on slower disks&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;&lt;STRONG&gt;Resolution&lt;/STRONG&gt;:&lt;/P&gt;
&lt;P&gt;You can resolve this issue by changing the location of ASP.NET temporary files using the tempDirectory attribute in web.config. This allows you to redirect ASP.NET to use a custom directory for temporary files by modifying your web.config as follows:&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-teams="true"&gt;&amp;lt;system.web&amp;gt;&lt;BR /&gt;&amp;nbsp; &lt;STRONG&gt;&amp;lt;compilation tempDirectory="E:\TemporaryASPNETFiles" /&amp;gt;&lt;/STRONG&gt;&lt;BR /&gt;&amp;lt;/system.web&amp;gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;Ensure the custom folder (E:\TemporaryASPNETFiles) is:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;Created manually&amp;nbsp;before use.&lt;/LI&gt;
&lt;LI&gt;Writable by the IIS App Pool identity, e.g., IIS APPPOOL\YourAppPoolName. You can set permissions via File Explorer or using PowerShell.&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;After making this change:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;Recycle the application pool&amp;nbsp;or&lt;/LI&gt;
&lt;LI&gt;Restart IIS using iisreset to apply the new configuration&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;Important Note:&lt;/P&gt;
&lt;P&gt;This setting is valid for ASP.NET (System.Web) applications running on the .NET Framework. It does not apply to ASP.NET Core.&lt;/P&gt;</description>
      <pubDate>Tue, 02 Sep 2025 16:22:53 GMT</pubDate>
      <guid>https://techcommunity.microsoft.com/t5/iis-support-blog/customizing-temporary-file-paths-in-asp-net-applications/ba-p/4411172</guid>
      <dc:creator>Tanya_Dhariwal</dc:creator>
      <dc:date>2025-09-02T16:22:53Z</dc:date>
    </item>
    <item>
      <title>From Hello to Secure: The SSL/TLS Handshake Explained Like a Conversation</title>
      <link>https://techcommunity.microsoft.com/t5/iis-support-blog/from-hello-to-secure-the-ssl-tls-handshake-explained-like-a/ba-p/4413208</link>
      <description>&lt;P data-start="348" data-end="569"&gt;Hey everyone!&amp;nbsp;&lt;BR data-start="364" data-end="367" /&gt;Welcome back to the blog — today, we’re going to break down something that powers almost every secure interaction on the internet, but sounds way more intimidating than it is: &lt;STRONG data-start="543" data-end="568"&gt;the SSL/TLS handshake&lt;/STRONG&gt;.&lt;/P&gt;
&lt;P data-start="571" data-end="762"&gt;You can read on how to setup SSL on IIS here :&lt;BR /&gt;&lt;BR /&gt;&lt;A class="lia-internal-link lia-internal-url lia-internal-url-content-type-blog" href="https://techcommunity.microsoft.com/blog/iis-support-blog/how-to-set-up-ssl-on-iis/4413200" data-lia-auto-title="Access Denied | Microsoft Community Hub" data-lia-auto-title-active="0" target="_blank"&gt;Access Denied | Microsoft Community Hub&lt;/A&gt;&amp;nbsp;&lt;/P&gt;
&lt;P data-start="571" data-end="762"&gt;&lt;BR /&gt;You’ve probably heard of SSL or TLS when someone talks about “HTTPS” or “secure websites.” But what’s really happening under the hood when your browser says "Secure"? Let’s find out together.&lt;/P&gt;
&lt;P data-start="571" data-end="762"&gt;&amp;nbsp;&lt;/P&gt;
&lt;H2 data-start="769" data-end="811"&gt;&lt;STRONG&gt;First Things First: What Is SSL/TLS?&lt;/STRONG&gt;&lt;/H2&gt;
&lt;P data-start="813" data-end="924"&gt;SSL (Secure Sockets Layer) and TLS (Transport Layer Security) are &lt;STRONG data-start="879" data-end="906"&gt;cryptographic protocols&lt;/STRONG&gt;. Their job is to:&lt;/P&gt;
&lt;UL data-start="926" data-end="1128"&gt;
&lt;LI data-start="926" data-end="995"&gt;Encrypt data between client and server (so no one else can read it)&lt;/LI&gt;
&lt;LI data-start="996" data-end="1073"&gt;Verify that the server (and optionally the client) is &lt;STRONG data-start="1052" data-end="1073"&gt;who it says it is&lt;/STRONG&gt;&lt;/LI&gt;
&lt;LI data-start="1074" data-end="1128"&gt;Ensure data hasn’t been tampered with during transit&lt;/LI&gt;
&lt;/UL&gt;
&lt;P data-start="1130" data-end="1264"&gt;SSL is the older version, and TLS is its improved, more secure successor. Nowadays, when people say “SSL,” they usually mean “TLS.”&lt;/P&gt;
&lt;P data-start="1130" data-end="1264"&gt;&amp;nbsp;&lt;/P&gt;
&lt;H2 data-start="1271" data-end="1307"&gt;&lt;STRONG&gt;What Is the SSL/TLS Handshake?&lt;/STRONG&gt;&lt;/H2&gt;
&lt;P data-start="1309" data-end="1441"&gt;Before secure communication begins, the &lt;STRONG data-start="1349" data-end="1379"&gt;client (like your browser)&lt;/STRONG&gt; and the &lt;STRONG data-start="1388" data-end="1416"&gt;server (like microsoft.com)&lt;/STRONG&gt; go through a process to:&lt;/P&gt;
&lt;UL data-start="1443" data-end="1538"&gt;
&lt;LI data-start="1443" data-end="1481"&gt;Agree on how to communicate securely&lt;/LI&gt;
&lt;LI data-start="1482" data-end="1507"&gt;Authenticate each other&lt;/LI&gt;
&lt;LI data-start="1508" data-end="1538"&gt;Exchange keys for encryption&lt;/LI&gt;
&lt;/UL&gt;
&lt;P data-start="1540" data-end="1589"&gt;That process is called the &lt;STRONG data-start="1567" data-end="1588"&gt;SSL/TLS handshake&lt;/STRONG&gt;.&lt;/P&gt;
&lt;P data-start="1591" data-end="1818"&gt;Think of it like this:&lt;BR data-start="1613" data-end="1616" /&gt;The browser and server meet each other at a masquerade party. Before dancing (i.e., securely exchanging data), they check IDs, agree on the music, and lock the dancefloor so no one else can sneak in.&lt;/P&gt;
&lt;H2 data-start="1825" data-end="1886"&gt;&lt;STRONG&gt;Step-by-Step: How the SSL/TLS Handshake Works (TLS 1.2)&lt;/STRONG&gt;&lt;/H2&gt;
&lt;P data-start="1888" data-end="1980"&gt;Let’s break it down using &lt;STRONG data-start="1914" data-end="1925"&gt;TLS 1.2&lt;/STRONG&gt; (most widely used, though TLS 1.3 is also common now).&lt;/P&gt;
&lt;H3 data-start="1982" data-end="2004"&gt;&lt;STRONG&gt;1.&lt;/STRONG&gt; &lt;STRONG data-start="1989" data-end="2004"&gt;ClientHello&lt;/STRONG&gt;&lt;/H3&gt;
&lt;P data-start="2006" data-end="2047"&gt;The browser initiates the handshake with:&lt;/P&gt;
&lt;UL data-start="2049" data-end="2207"&gt;
&lt;LI data-start="2049" data-end="2075"&gt;Supported TLS versions&lt;/LI&gt;
&lt;LI data-start="2076" data-end="2129"&gt;List of supported cipher suites (ways to encrypt)&lt;/LI&gt;
&lt;LI data-start="2130" data-end="2163"&gt;Random number (client_random)&lt;/LI&gt;
&lt;LI data-start="2164" data-end="2207"&gt;Optional: Server name (via SNI extension)&lt;/LI&gt;
&lt;/UL&gt;
&lt;P data-start="2209" data-end="2300"&gt;&amp;nbsp;This is the browser saying, “Hey, here are the languages I speak. Can we talk securely?”&lt;/P&gt;
&lt;H3 data-start="2307" data-end="2329"&gt;&lt;STRONG&gt;2.&lt;/STRONG&gt; &lt;STRONG data-start="2314" data-end="2329"&gt;ServerHello&lt;/STRONG&gt;&lt;/H3&gt;
&lt;P data-start="2331" data-end="2356"&gt;The server responds with:&lt;/P&gt;
&lt;UL data-start="2358" data-end="2549"&gt;
&lt;LI data-start="2358" data-end="2380"&gt;Chosen TLS version&lt;/LI&gt;
&lt;LI data-start="2381" data-end="2406"&gt;Selected cipher suite&lt;/LI&gt;
&lt;LI data-start="2407" data-end="2448"&gt;Its own random number (server_random)&lt;/LI&gt;
&lt;LI data-start="2449" data-end="2494"&gt;Digital certificate (proves its identity)&lt;/LI&gt;
&lt;LI data-start="2495" data-end="2549"&gt;Optional: ServerKeyExchange (for some cipher suites)&lt;/LI&gt;
&lt;/UL&gt;
&lt;P data-start="2551" data-end="2682"&gt;&amp;nbsp;This is the server saying, “Sure, I’ll speak this encryption language. Here’s my ID (certificate) to prove I am who I say I am.”&lt;/P&gt;
&lt;H3 data-start="2689" data-end="2741"&gt;&lt;STRONG&gt;3. &lt;/STRONG&gt;&lt;STRONG data-start="2696" data-end="2741"&gt;Certificate Verification (on client side)&lt;/STRONG&gt;&lt;/H3&gt;
&lt;P data-start="2743" data-end="2764"&gt;The client checks if:&lt;/P&gt;
&lt;UL data-start="2766" data-end="2866"&gt;
&lt;LI data-start="2766" data-end="2813"&gt;The certificate is valid and trusted (via CA)&lt;/LI&gt;
&lt;LI data-start="2814" data-end="2836"&gt;The hostname matches&lt;/LI&gt;
&lt;LI data-start="2837" data-end="2866"&gt;It’s not expired or revoked&lt;/LI&gt;
&lt;/UL&gt;
&lt;P data-start="2868" data-end="2950"&gt;&amp;nbsp;Think of it like checking if a driver's license is real and matches the person.&lt;/P&gt;
&lt;H3 data-start="2957" data-end="2996"&gt;&lt;STRONG&gt;4. &lt;/STRONG&gt;&lt;STRONG data-start="2964" data-end="2996"&gt;Pre-Master Secret Generation&lt;/STRONG&gt;&lt;/H3&gt;
&lt;UL data-start="2998" data-end="3163"&gt;
&lt;LI data-start="2998" data-end="3068"&gt;Client generates a &lt;STRONG data-start="3019" data-end="3040"&gt;Pre-Master Secret&lt;/STRONG&gt; (a temporary, shared value)&lt;/LI&gt;
&lt;LI data-start="3069" data-end="3138"&gt;It encrypts this using the server’s public key (from certificate)&lt;/LI&gt;
&lt;LI data-start="3139" data-end="3163"&gt;Sends it to the server&lt;/LI&gt;
&lt;/UL&gt;
&lt;P data-start="3165" data-end="3237"&gt;Only the server can decrypt this because only it has the private key.&lt;/P&gt;
&lt;H3 data-start="3244" data-end="3285"&gt;&lt;STRONG&gt;5.&lt;/STRONG&gt; &lt;STRONG data-start="3251" data-end="3285"&gt;Key Derivation (on both sides)&lt;/STRONG&gt;&lt;/H3&gt;
&lt;P data-start="3287" data-end="3293"&gt;Using:&lt;/P&gt;
&lt;UL data-start="3295" data-end="3352"&gt;
&lt;LI data-start="3295" data-end="3316"&gt;Pre-Master Secret&lt;/LI&gt;
&lt;LI data-start="3317" data-end="3334"&gt;client_random&lt;/LI&gt;
&lt;LI data-start="3335" data-end="3352"&gt;server_random&lt;/LI&gt;
&lt;/UL&gt;
&lt;P data-start="3354" data-end="3472"&gt;Both the client and the server derive the &lt;STRONG data-start="3396" data-end="3426"&gt;same symmetric session key&lt;/STRONG&gt;, which will be used to encrypt communication.&lt;/P&gt;
&lt;H3 data-start="3479" data-end="3507"&gt;&lt;STRONG&gt;6.&lt;/STRONG&gt; &lt;STRONG data-start="3486" data-end="3507"&gt;Finished Messages&lt;/STRONG&gt;&lt;/H3&gt;
&lt;UL data-start="3509" data-end="3617"&gt;
&lt;LI data-start="3509" data-end="3575"&gt;Client sends a “Finished” message (encrypted with the new key)&lt;/LI&gt;
&lt;LI data-start="3576" data-end="3617"&gt;Server sends its own “Finished” message&lt;/LI&gt;
&lt;/UL&gt;
&lt;P data-start="3619" data-end="3694"&gt;Now both sides know the connection is secure. The handshake is complete!&lt;/P&gt;
&lt;P data-start="3696" data-end="3778"&gt;From here on, your data (like passwords, credit card info, chats) is encrypted.&lt;/P&gt;
&lt;H2 data-start="3785" data-end="3835"&gt;&lt;STRONG&gt;What Does This Look Like in a Network Trace?&lt;/STRONG&gt;&lt;/H2&gt;
&lt;P data-start="3837" data-end="3979"&gt;Let’s peek into a real-world network trace using Microsoft Network Monitor (NetMon) or Wireshark.&amp;nbsp;&lt;/P&gt;
&lt;img /&gt;
&lt;DIV class="styles_lia-table-wrapper__h6Xo9 styles_table-responsive__MW0lN"&gt;&lt;table border="1" style="border-width: 1px;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;SPAN class="lia-text-color-6"&gt;TLS:TLS Rec Layer-1 HandShake: Client Hello.&lt;/SPAN&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;SPAN class="lia-text-color-15"&gt;TLS:TLS Rec Layer-1 HandShake: Server Hello.; TLS Rec Layer-2 HandShake: Certificate.&lt;/SPAN&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;SPAN class="lia-text-color-15"&gt;TLS:Continued Data: 1378 Bytes&lt;/SPAN&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;SPAN class="lia-text-color-8"&gt;TLS:TLS Rec Layer-1 HandShake: Client Key Exchange.; TLS Rec Layer-2 Cipher Change Spec; TLS Rec Layer-3 HandShake: Encrypted Handshake Message.&lt;/SPAN&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;SPAN class="lia-text-color-9"&gt;TLS:TLS Rec Layer-1 HandShake: Encrypted Handshake Message.; TLS Rec Layer-2 Cipher Change Spec; TLS Rec Layer-3 HandShake: Encrypted Handshake Message.&lt;/SPAN&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;TLS:TLS Rec Layer-1 SSL Application Data&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;TLS:TLS Rec Layer-1 SSL Application Data&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;TLS:TLS Rec Layer-1 SSL Application Data&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/DIV&gt;
&lt;H3 data-start="4493" data-end="4522"&gt;&lt;STRONG&gt;What’s Happening Here?&lt;/STRONG&gt;&lt;/H3&gt;
&lt;H4 data-start="4524" data-end="4551"&gt;Frame 1: ClientHello&lt;/H4&gt;
&lt;P data-start="4552" data-end="4629"&gt;You’ll see the cipher suites listed and maybe an SNI (like www.domain.com).&lt;/P&gt;
&lt;H4 data-start="4631" data-end="4672"&gt;Frame 2: ServerHello + Certificate&lt;/H4&gt;
&lt;P data-start="4673" data-end="4693"&gt;This frame includes:&lt;/P&gt;
&lt;UL data-start="4695" data-end="4767"&gt;
&lt;LI data-start="4695" data-end="4729"&gt;Server's selected cipher suite&lt;/LI&gt;
&lt;LI data-start="4730" data-end="4767"&gt;Digital certificate with public key&lt;/LI&gt;
&lt;/UL&gt;
&lt;P data-start="4769" data-end="4869"&gt;Expand the &lt;STRONG data-start="4780" data-end="4795"&gt;certificate&lt;/STRONG&gt; section to view fields like CN (Common Name), issuer, and validity dates.&lt;/P&gt;
&lt;H4 data-start="4871" data-end="4904"&gt;Frame 3: ClientKeyExchange&lt;/H4&gt;
&lt;P data-start="4905" data-end="4976"&gt;The Pre-Master Secret is sent (encrypted with the server’s public key).&lt;/P&gt;
&lt;P data-start="4978" data-end="5079"&gt;Then you’ll also see &lt;STRONG data-start="4999" data-end="5019"&gt;ChangeCipherSpec&lt;/STRONG&gt; — this says, “From now on, I’m speaking in encrypted form.”&lt;/P&gt;
&lt;H4 data-start="5081" data-end="5112"&gt;Frame 4: Server Finished&lt;/H4&gt;
&lt;P data-start="5113" data-end="5258"&gt;The server also sends ChangeCipherSpec and finishes the handshake. From this point forward, application data (like your login info) is encrypted.&lt;/P&gt;
&lt;H2 data-start="5265" data-end="5284"&gt;Final Thoughts&lt;/H2&gt;
&lt;P data-start="5286" data-end="5408"&gt;And there you go! That’s the SSL/TLS handshake, explained step-by-step with a peek into what it looks like on the wire.&amp;nbsp;&lt;/P&gt;
&lt;P data-start="5410" data-end="5624"&gt;It might seem complicated at first, but once you break it down, it's just a smart conversation between two computers deciding how to talk securely — kind of like two spies agreeing on a secret code before chatting.&lt;/P&gt;
&lt;H2 data-start="5631" data-end="5654"&gt;Got Questions?&lt;/H2&gt;
&lt;P data-start="5656" data-end="5772"&gt;Drop your questions in the comments — I love digging into anything nerdy.&amp;nbsp;&lt;/P&gt;
&lt;P data-start="5774" data-end="5824"&gt;Until next time — stay curious and stay secure!&lt;/P&gt;
&lt;P data-start="1591" data-end="1818"&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Tue, 02 Sep 2025 16:21:48 GMT</pubDate>
      <guid>https://techcommunity.microsoft.com/t5/iis-support-blog/from-hello-to-secure-the-ssl-tls-handshake-explained-like-a/ba-p/4413208</guid>
      <dc:creator>meenakshiBalekar</dc:creator>
      <dc:date>2025-09-02T16:21:48Z</dc:date>
    </item>
    <item>
      <title>Why Port 87 Works in IE and Curl but Fails in Edge and Chrome: Understanding ERR_UNSAFE_PORT</title>
      <link>https://techcommunity.microsoft.com/t5/iis-support-blog/why-port-87-works-in-ie-and-curl-but-fails-in-edge-and-chrome/ba-p/4427455</link>
      <description>&lt;P&gt;&lt;STRONG&gt;Overview&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;In enterprise environments, configuring IIS to run on non-standard ports is a common practice. However, this can lead to unexpected browser behavior. One such case involves &lt;STRONG&gt;port 87&lt;/STRONG&gt;, which works seamlessly in &lt;STRONG&gt;Internet Explorer (IE)&lt;/STRONG&gt; and via &lt;STRONG&gt;Curl&lt;/STRONG&gt;, but fails in &lt;STRONG&gt;Microsoft Edge&lt;/STRONG&gt; and &lt;STRONG&gt;Google Chrome&lt;/STRONG&gt;, throwing an ERR_UNSAFE_PORT error.&lt;/P&gt;
&lt;P&gt;This blog explores the root cause and resolution strategies for this issue.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Summary&lt;/STRONG&gt;&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG&gt;Environment&lt;/STRONG&gt;: Windows Server with Chromium-based Edge or Chrome&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Application&lt;/STRONG&gt;: IIS-hosted application on &lt;STRONG&gt;port 87&lt;/STRONG&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Symptoms&lt;/STRONG&gt;:&lt;/LI&gt;
&lt;UL&gt;
&lt;LI&gt;Works fine in &lt;STRONG&gt;Internet Explorer&lt;/STRONG&gt;&lt;/LI&gt;
&lt;LI&gt;Works via &lt;STRONG&gt;Curl command&lt;/STRONG&gt;&lt;/LI&gt;
&lt;LI&gt;Fails in &lt;STRONG&gt;Edge and Chrome&lt;/STRONG&gt; with ERR_UNSAFE_PORT&lt;/LI&gt;
&lt;/UL&gt;
&lt;/UL&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Root Cause Analysis&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;Modern browsers like &lt;STRONG&gt;Edge&lt;/STRONG&gt; and &lt;STRONG&gt;Chrome&lt;/STRONG&gt; are built on the &lt;STRONG&gt;Chromium engine&lt;/STRONG&gt;, which includes a security feature that blocks access to certain ports deemed unsafe. These ports are reserved for legacy or sensitive protocols and are listed in Chromium’s port_util.cc file.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Port 87&lt;/STRONG&gt; is among the restricted ports, historically associated with the &lt;STRONG&gt;ttylink&lt;/STRONG&gt; protocol&lt;/P&gt;
&lt;P&gt;The full list of blocked ports includes:&lt;/P&gt;
&lt;P&gt;1, 7, 9, 11, 13, 15, 17, 19, 20, 21, 22, 23, 25, 37, 42, 43, 53, 69, 77, 79, 87, ...&lt;/P&gt;
&lt;P&gt;For the complete list, refer to &lt;A href="https://superuser.com/questions/188058/which-ports-are-considered-unsafe-by-chrome" target="_blank" rel="noopener"&gt;https://superuser.com/questions/188058/which-ports-are-considered-unsafe-by-chrome&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Resolution Options&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;✅&lt;/STRONG&gt;&lt;STRONG&gt; Recommended Solution: Change the Port&lt;/STRONG&gt;&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG&gt;Action&lt;/STRONG&gt;: Reconfigure IIS to use a port &lt;STRONG&gt;not listed&lt;/STRONG&gt; in the restricted ports array.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Reason&lt;/STRONG&gt;: Chromium browsers will continue to block unsafe ports by design. There is &lt;STRONG&gt;no registry key or browser setting&lt;/STRONG&gt; to override this behavior.&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;&lt;STRONG&gt;🧩&lt;/STRONG&gt;&lt;STRONG&gt; Alternative: Use IE Mode in Edge&lt;/STRONG&gt;&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG&gt;Action&lt;/STRONG&gt;: Enable &lt;STRONG&gt;Internet Explorer Mode&lt;/STRONG&gt; in Edge using the &lt;STRONG&gt;Enterprise Mode Site List Manager&lt;/STRONG&gt;.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Use Case&lt;/STRONG&gt;: If changing the port is not feasible due to legacy dependencies.&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Conclusion&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;The ERR_UNSAFE_PORT error in Edge and Chrome is not a bug but a &lt;STRONG&gt;security feature&lt;/STRONG&gt;. While legacy tools like IE and Curl bypass this restriction, modern browsers enforce it strictly. The best path forward is to &lt;STRONG&gt;migrate your IIS service to a safe port&lt;/STRONG&gt; or &lt;STRONG&gt;leverage IE Mode&lt;/STRONG&gt; for backward compatibility.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;&amp;nbsp;&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;References&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;&lt;A href="https://superuser.com/questions/188058/which-ports-are-considered-unsafe-by-chrome" target="_blank" rel="noopener"&gt;https://superuser.com/questions/188058/which-ports-are-considered-unsafe-by-chrome&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&lt;A href="https://www-archive.mozilla.org/projects/netlib/portbanning#portlist" target="_blank" rel="noopener"&gt;https://www-archive.mozilla.org/projects/netlib/portbanning#portlist&lt;/A&gt;&lt;/P&gt;</description>
      <pubDate>Tue, 02 Sep 2025 16:21:22 GMT</pubDate>
      <guid>https://techcommunity.microsoft.com/t5/iis-support-blog/why-port-87-works-in-ie-and-curl-but-fails-in-edge-and-chrome/ba-p/4427455</guid>
      <dc:creator>Goyal_Sandeep</dc:creator>
      <dc:date>2025-09-02T16:21:22Z</dc:date>
    </item>
    <item>
      <title>How to Set Up SSL on IIS</title>
      <link>https://techcommunity.microsoft.com/t5/iis-support-blog/how-to-set-up-ssl-on-iis/ba-p/4413200</link>
      <description>&lt;P data-start="297" data-end="687"&gt;&lt;STRONG data-start="297" data-end="310"&gt;Hi All!&lt;/STRONG&gt;&amp;nbsp;&lt;BR /&gt;&lt;BR data-start="313" data-end="316" /&gt;If you're running a website on a Windows server using &lt;STRONG data-start="370" data-end="409"&gt;IIS (Internet Information Services)&lt;/STRONG&gt;, and you're thinking &lt;EM data-start="431" data-end="469"&gt;"How do I make my site more secure?"&lt;/EM&gt; — you're in the right place.&lt;BR data-start="498" data-end="501" /&gt;&lt;BR /&gt;In this guide, I’ll walk you through setting up &lt;STRONG data-start="549" data-end="579"&gt;SSL (Secure Sockets Layer)&lt;/STRONG&gt; on IIS. Whether you're doing this for a production environment or just want to learn, I’ve got you covered.&lt;/P&gt;
&lt;P data-start="297" data-end="687"&gt;&amp;nbsp;&lt;/P&gt;
&lt;H2 data-start="694" data-end="747"&gt;&lt;STRONG data-start="700" data-end="747"&gt;First, What is SSL and Why Should You Care?&lt;/STRONG&gt;&lt;/H2&gt;
&lt;P data-start="749" data-end="950"&gt;Think of SSL as a &lt;STRONG data-start="767" data-end="797"&gt;bodyguard for your website&lt;/STRONG&gt;. It encrypts communication between your users and your server — so hackers can't snoop in and grab sensitive data like passwords or credit card numbers.&lt;/P&gt;
&lt;P data-start="952" data-end="1014"&gt;Here’s how SSL (and its more modern version TLS) protects you:&lt;/P&gt;
&lt;UL data-start="1015" data-end="1229"&gt;
&lt;LI data-start="1015" data-end="1091"&gt;&lt;STRONG data-start="1017" data-end="1032"&gt;Encryption:&lt;/STRONG&gt; Jumbles up data so only the intended receiver can read it.&lt;/LI&gt;
&lt;LI data-start="1092" data-end="1161"&gt;&lt;STRONG data-start="1094" data-end="1113"&gt;Authentication:&lt;/STRONG&gt; Confirms your website is legit — not a copycat.&lt;/LI&gt;
&lt;LI data-start="1162" data-end="1229"&gt;&lt;STRONG data-start="1164" data-end="1178"&gt;Integrity:&lt;/STRONG&gt; Prevents data from being tampered with in transit.&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;&lt;EM data-start="1235" data-end="1344"&gt;With SSL, your site changes from http:// to https:// and you get that nice padlock icon in the browser.&lt;/EM&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;H2 data-start="1351" data-end="1400"&gt;&lt;STRONG data-start="1357" data-end="1400"&gt;What You’ll Need Before Getting Started&lt;/STRONG&gt;&lt;/H2&gt;
&lt;P data-start="1402" data-end="1461"&gt;Before jumping in, here’s your SSL setup toolkit checklist:&lt;/P&gt;
&lt;DIV class="styles_lia-table-wrapper__h6Xo9 styles_table-responsive__MW0lN"&gt;&lt;table border="1" style="border-width: 1px;"&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Item&lt;/th&gt;&lt;th&gt;Why It’s Needed&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&amp;nbsp;A domain name&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;SSL is tied to a specific domain&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&amp;nbsp;An SSL certificate&lt;/td&gt;&lt;td&gt;Purchased from a CA or created for internal use&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&amp;nbsp;Windows Server with IIS&lt;/td&gt;&lt;td&gt;That’s where we’ll set up the SSL&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&amp;nbsp;Admin access&lt;/td&gt;&lt;td&gt;To install and manage certificates&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&amp;nbsp;Port 443 open in firewall&lt;/td&gt;&lt;td&gt;The port SSL uses to talk to browsers&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/DIV&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;H2 data-start="2086" data-end="2143"&gt;&lt;STRONG data-start="2092" data-end="2143"&gt;Understanding the SSL/TLS Handshake (Made Easy)&lt;/STRONG&gt;&lt;/H2&gt;
&lt;P data-start="2145" data-end="2213"&gt;Here’s how the magic happens when someone visits your HTTPS website:&lt;/P&gt;
&lt;OL data-start="2215" data-end="2570"&gt;
&lt;LI data-start="2215" data-end="2290"&gt;&lt;STRONG data-start="2218" data-end="2235"&gt;Client Hello:&lt;/STRONG&gt; Your browser says, "Hi server, here’s what I support!"&lt;/LI&gt;
&lt;LI data-start="2291" data-end="2377"&gt;&lt;STRONG data-start="2294" data-end="2311"&gt;Server Hello:&lt;/STRONG&gt; The server replies, "Hi back! Here’s my certificate and details."&lt;/LI&gt;
&lt;LI data-start="2378" data-end="2450"&gt;&lt;STRONG data-start="2381" data-end="2406"&gt;Certificate Exchange:&lt;/STRONG&gt; Browser checks if the certificate is valid.&lt;/LI&gt;
&lt;LI data-start="2451" data-end="2514"&gt;&lt;STRONG data-start="2454" data-end="2471"&gt;Key Exchange:&lt;/STRONG&gt; They agree on encryption methods and keys.&lt;/LI&gt;
&lt;LI data-start="2515" data-end="2570"&gt;&lt;STRONG data-start="2518" data-end="2537"&gt;Secure Session:&lt;/STRONG&gt; Boom! Now all data is encrypted.&lt;/LI&gt;
&lt;/OL&gt;
&lt;P&gt;&lt;EM data-start="2578" data-end="2714"&gt;Imagine this like a secret handshake between your browser and the server — if done right, everything that follows is in a secret code.&lt;BR /&gt;&lt;BR /&gt;&lt;/EM&gt;&lt;/P&gt;
&lt;img /&gt;
&lt;H2 data-start="2721" data-end="2770"&gt;&lt;STRONG data-start="2727" data-end="2770"&gt;How to Set Up SSL on IIS – Step by Step&lt;/STRONG&gt;&lt;/H2&gt;
&lt;P data-start="2772" data-end="2856"&gt;Let’s get our hands dirty! Here's how you actually install and configure SSL on IIS.&lt;/P&gt;
&lt;H3 data-start="2863" data-end="2903"&gt;&lt;STRONG data-start="2869" data-end="2903"&gt;&amp;nbsp;Step 1: Get an SSL Certificate&lt;/STRONG&gt;&lt;/H3&gt;
&lt;P data-start="2904" data-end="2925"&gt;You have two choices:&lt;/P&gt;
&lt;UL data-start="2926" data-end="3101"&gt;
&lt;LI data-start="2926" data-end="3014"&gt;&lt;STRONG data-start="2928" data-end="2939"&gt;Buy one&lt;/STRONG&gt; from a trusted Certificate Authority (e.g., DigiCert, GoDaddy, Namecheap).&lt;/LI&gt;
&lt;LI data-start="3015" data-end="3101"&gt;&lt;STRONG data-start="3017" data-end="3055"&gt;Generate a self-signed certificate&lt;/STRONG&gt; using IIS (only for testing or internal use not for production).&lt;/LI&gt;
&lt;/UL&gt;
&lt;P data-start="3103" data-end="3138"&gt;&lt;EM data-start="3107" data-end="3138"&gt;To create a self-signed cert:&lt;/EM&gt;&lt;/P&gt;
&lt;UL data-start="3139" data-end="3258"&gt;
&lt;LI data-start="3139" data-end="3161"&gt;Open &lt;STRONG data-start="3146" data-end="3161"&gt;IIS Manager&lt;/STRONG&gt;&lt;/LI&gt;
&lt;LI data-start="3162" data-end="3189"&gt;Click on your server name&lt;/LI&gt;
&lt;LI data-start="3190" data-end="3258"&gt;Go to &lt;STRONG data-start="3198" data-end="3221"&gt;Server Certificates&lt;/STRONG&gt; &amp;gt; &lt;STRONG data-start="3224" data-end="3258"&gt;Create Self-Signed Certificate&lt;/STRONG&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;H3 data-start="3265" data-end="3306"&gt;&lt;STRONG data-start="3271" data-end="3306"&gt;Step 2: Install the Certificate&lt;/STRONG&gt;&lt;/H3&gt;
&lt;P data-start="3308" data-end="3353"&gt;Let’s plug that certificate into your server:&lt;/P&gt;
&lt;OL data-start="3355" data-end="3639"&gt;
&lt;LI data-start="3355" data-end="3403"&gt;Press &lt;STRONG data-start="3364" data-end="3379"&gt;Windows + R&lt;/STRONG&gt;, type mmc, hit Enter.&lt;/LI&gt;
&lt;LI data-start="3404" data-end="3498"&gt;Go to &lt;STRONG data-start="3413" data-end="3442"&gt;File &amp;gt; Add/Remove Snap-in&lt;/STRONG&gt; &amp;gt; Choose &lt;STRONG data-start="3452" data-end="3468"&gt;Certificates&lt;/STRONG&gt; &amp;gt; Select &lt;STRONG data-start="3478" data-end="3498"&gt;Computer Account&lt;/STRONG&gt;&lt;/LI&gt;
&lt;LI data-start="3499" data-end="3541"&gt;Navigate to &lt;STRONG data-start="3514" data-end="3541"&gt;Personal &amp;gt; Certificates&lt;/STRONG&gt;&lt;/LI&gt;
&lt;LI data-start="3542" data-end="3639"&gt;Right-click and select &lt;STRONG data-start="3568" data-end="3578"&gt;Import&lt;/STRONG&gt;, then follow the wizard to import your SSL certificate file.&lt;/LI&gt;
&lt;/OL&gt;
&lt;H3 data-start="3646" data-end="3700"&gt;&lt;STRONG data-start="3652" data-end="3700"&gt;Step 3: Bind the Certificate to Your Website&lt;/STRONG&gt;&lt;/H3&gt;
&lt;P data-start="3702" data-end="3750"&gt;Now, let’s link the cert to your actual website:&lt;/P&gt;
&lt;OL data-start="3752" data-end="3989"&gt;
&lt;LI data-start="3752" data-end="3775"&gt;Open &lt;STRONG data-start="3760" data-end="3775"&gt;IIS Manager&lt;/STRONG&gt;&lt;/LI&gt;
&lt;LI data-start="3776" data-end="3837"&gt;In the left panel, expand &lt;STRONG data-start="3805" data-end="3814"&gt;Sites&lt;/STRONG&gt; and click on your site&lt;/LI&gt;
&lt;LI data-start="3838" data-end="3874"&gt;Click &lt;STRONG data-start="3847" data-end="3859"&gt;Bindings&lt;/STRONG&gt; (on the right)&lt;/LI&gt;
&lt;LI data-start="3875" data-end="3956"&gt;Click &lt;STRONG data-start="3884" data-end="3891"&gt;Add&lt;/STRONG&gt; → Choose &lt;STRONG data-start="3901" data-end="3916"&gt;Type: https&lt;/STRONG&gt; → Select your certificate from the list&lt;/LI&gt;
&lt;LI data-start="3957" data-end="3989"&gt;Hit &lt;STRONG data-start="3964" data-end="3970"&gt;OK&lt;/STRONG&gt; and then &lt;STRONG data-start="3980" data-end="3989"&gt;Close&lt;/STRONG&gt;&lt;/LI&gt;
&lt;/OL&gt;
&lt;H3 data-start="3996" data-end="4028"&gt;&lt;STRONG data-start="4002" data-end="4028"&gt;Step 4: Test the Setup&lt;/STRONG&gt;&lt;/H3&gt;
&lt;P data-start="4030" data-end="4086"&gt;Fire up your browser and go to &lt;A class="lia-external-url" href="https://yourdomain.com" target="_blank" rel="noopener"&gt;https://yourdomain.com&lt;/A&gt; ( hoping your domain is already registered )&lt;/P&gt;
&lt;UL&gt;
&lt;LI data-start="4088" data-end="4147"&gt;Do you see the padlock icon?&lt;/LI&gt;
&lt;LI data-start="4088" data-end="4147"&gt;No warnings or errors?&lt;/LI&gt;
&lt;/UL&gt;
&lt;P data-start="4149" data-end="4177"&gt;Awesome! Your SSL is live and ready to use&lt;/P&gt;
&lt;P data-start="4149" data-end="4177"&gt;&amp;nbsp;&lt;/P&gt;
&lt;H2 data-start="4184" data-end="4238"&gt;&lt;STRONG data-start="4189" data-end="4238"&gt;Where Are SSL Certificates Stored in Windows?&lt;/STRONG&gt;&lt;/H2&gt;
&lt;P data-start="4240" data-end="4313"&gt;You can find them in the &lt;STRONG data-start="4265" data-end="4294"&gt;Windows Certificate Store&lt;/STRONG&gt;, accessed via MMC:&lt;/P&gt;
&lt;UL data-start="4315" data-end="4471"&gt;
&lt;LI data-start="4315" data-end="4383"&gt;&lt;STRONG data-start="4317" data-end="4345"&gt;Personal &amp;gt; Certificates:&lt;/STRONG&gt; These are certs for the local machine&lt;/LI&gt;
&lt;LI data-start="4384" data-end="4471"&gt;&lt;STRONG data-start="4386" data-end="4429"&gt;Trusted Root Certification Authorities:&lt;/STRONG&gt; These store certificates from trusted CAs&lt;/LI&gt;
&lt;/UL&gt;
&lt;H2 data-start="4478" data-end="4540"&gt;&lt;STRONG data-start="4485" data-end="4540"&gt;Troubleshooting Tips: What If Something Goes Wrong?&lt;/STRONG&gt;&lt;/H2&gt;
&lt;P data-start="4542" data-end="4602"&gt;Even if something breaks, don’t panic. Here's where to look:&lt;/P&gt;
&lt;DIV class="styles_lia-table-wrapper__h6Xo9 styles_table-responsive__MW0lN"&gt;&lt;table border="1" style="border-width: 1px;"&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Tool/Log&lt;/th&gt;&lt;th&gt;What to Check For&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;STRONG data-start="4774" data-end="4786"&gt;IIS Logs&lt;/STRONG&gt;&lt;/td&gt;&lt;td&gt;Status codes like 403 or 500&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;STRONG data-start="4858" data-end="4874"&gt;Event Viewer&lt;/STRONG&gt;&lt;/td&gt;&lt;td&gt;SSL handshake errors under Application logs&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;STRONG data-start="4942" data-end="4961"&gt;Browser Console&lt;/STRONG&gt;&lt;/td&gt;&lt;td&gt;Certificate mismatches or expiry issues&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;STRONG data-start="5026" data-end="5053"&gt;Certificate Store (MMC)&lt;/STRONG&gt;&lt;/td&gt;&lt;td&gt;Expired certs, wrong bindings&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/DIV&gt;
&lt;H2 data-start="5114" data-end="5154"&gt;&lt;STRONG data-start="5120" data-end="5154"&gt;Why Use SSL? The Real Benefits&lt;/STRONG&gt;&lt;/H2&gt;
&lt;P data-start="5156" data-end="5204"&gt;Let’s recap why this effort is totally worth it:&lt;/P&gt;
&lt;UL data-start="5206" data-end="5405"&gt;
&lt;LI data-start="5206" data-end="5250"&gt;&lt;STRONG data-start="5211" data-end="5230"&gt;Better Security&lt;/STRONG&gt;: Encrypts user data&lt;/LI&gt;
&lt;LI data-start="5251" data-end="5303"&gt;&lt;STRONG data-start="5256" data-end="5270"&gt;More Trust&lt;/STRONG&gt;: Visitors know your site is safe&lt;/LI&gt;
&lt;LI data-start="5304" data-end="5354"&gt;&lt;STRONG data-start="5309" data-end="5332"&gt;Higher SEO Rankings&lt;/STRONG&gt;: Search engines prefers HTTPS&lt;/LI&gt;
&lt;LI data-start="5355" data-end="5405"&gt;&lt;STRONG data-start="5359" data-end="5373"&gt;Compliance&lt;/STRONG&gt;: Required for GDPR, HIPAA, etc.&lt;/LI&gt;
&lt;/UL&gt;
&lt;P data-start="5409" data-end="5468"&gt;In short, &lt;STRONG data-start="5419" data-end="5450"&gt;SSL is not optional anymore&lt;/STRONG&gt; — it’s essential.&lt;/P&gt;
&lt;H2 data-start="5475" data-end="5512"&gt;&lt;STRONG data-start="5480" data-end="5512"&gt;Conclusion: You’ve Got This!&lt;/STRONG&gt;&lt;/H2&gt;
&lt;P data-start="5514" data-end="5650"&gt;Setting up SSL on IIS might sound technical, but once you break it down, it’s really just a series of logical steps. You’ve now learned:&lt;/P&gt;
&lt;UL data-start="5652" data-end="5799"&gt;
&lt;LI data-start="5652" data-end="5688"&gt;What SSL is and why it’s important&lt;/LI&gt;
&lt;LI data-start="5689" data-end="5721"&gt;What tools you need to prepare&lt;/LI&gt;
&lt;LI data-start="5722" data-end="5763"&gt;How to install and bind the certificate&lt;/LI&gt;
&lt;LI data-start="5764" data-end="5799"&gt;How to troubleshoot common issues&lt;/LI&gt;
&lt;/UL&gt;
&lt;P data-start="5801" data-end="5995"&gt;&amp;nbsp;Whether you’re securing a business site or learning for personal growth, this knowledge is a big win. If you have questions or run into problems, drop them in the comments — I’m here to help!&lt;/P&gt;</description>
      <pubDate>Tue, 02 Sep 2025 16:20:32 GMT</pubDate>
      <guid>https://techcommunity.microsoft.com/t5/iis-support-blog/how-to-set-up-ssl-on-iis/ba-p/4413200</guid>
      <dc:creator>meenakshiBalekar</dc:creator>
      <dc:date>2025-09-02T16:20:32Z</dc:date>
    </item>
    <item>
      <title>Mutual Authentication in IIS</title>
      <link>https://techcommunity.microsoft.com/t5/iis-support-blog/mutual-authentication-in-iis/ba-p/4413390</link>
      <description>&lt;P data-start="429" data-end="445"&gt;Hey Everyone!&amp;nbsp;&lt;/P&gt;
&lt;P data-start="447" data-end="830"&gt;So today, let’s chat about something super important but often misunderstood — Mutual Authentication in IIS. If you've ever heard terms like &lt;EM data-start="592" data-end="605"&gt;two-way SSL&lt;/EM&gt;, &lt;EM data-start="607" data-end="628"&gt;client certificates&lt;/EM&gt;, or &lt;EM data-start="633" data-end="645"&gt;mutual TLS&lt;/EM&gt; and felt a little overwhelmed — don’t worry. I'm going to break it all down for you, just like I would if we were sitting across from each other and looking at a server setup together.&lt;BR /&gt;&lt;BR /&gt;Before you proceed read my previous blogs &lt;A class="lia-internal-link lia-internal-url lia-internal-url-content-type-blog" href="https://techcommunity.microsoft.com/blog/iis-support-blog/how-to-set-up-ssl-on-iis/4413200?previewMessage=true" data-lia-auto-title="Setup SSL on IIS&amp;nbsp;" data-lia-auto-title-active="0" target="_blank"&gt;Setup SSL on IIS&amp;nbsp;&lt;/A&gt;and &lt;A class="lia-internal-link lia-internal-url lia-internal-url-content-type-blog" href="https://techcommunity.microsoft.com/blog/iis-support-blog/from-hello-to-secure-the-ssltls-handshake-explained-like-a-conversation/4413208" data-lia-auto-title="TLS/SSL Handshake" data-lia-auto-title-active="0" target="_blank"&gt;TLS/SSL Handshake&lt;/A&gt;&amp;nbsp;&lt;/P&gt;
&lt;P data-start="832" data-end="848"&gt;Ready? Let’s go!&lt;/P&gt;
&lt;H2 data-start="855" data-end="893"&gt;&lt;STRONG&gt;What is&amp;nbsp;Mutual Authentication?&lt;/STRONG&gt;&lt;/H2&gt;
&lt;P data-start="895" data-end="1293"&gt;You know how, in most secure web connections, your browser checks the server’s certificate to make sure it’s talking to the right website? That’s one-way SSL. Now imagine flipping that around — the server also wants to verify that the client (you) is who they claim to be. That’s mutual authentication — both sides validate each other before they shake hands and start talking securely.&lt;BR /&gt;&lt;BR /&gt;&lt;/P&gt;
&lt;P data-start="1295" data-end="1321"&gt;So instead of just saying:&lt;/P&gt;
&lt;P data-start="1324" data-end="1367"&gt;"You’re The website? Okay cool, here’s my data."&lt;/P&gt;
&lt;P data-start="1369" data-end="1386"&gt;Now we’re saying:&lt;/P&gt;
&lt;P data-start="1389" data-end="1488"&gt;"You’re The website? Okay, prove it.&lt;BR data-start="1420" data-end="1423" /&gt;I'm a valid client? Here's my certificate — you verify it too."&lt;/P&gt;
&lt;P data-start="1490" data-end="1537"&gt;Mutual authentication = trust on &lt;EM data-start="1523" data-end="1535"&gt;both sides&lt;/EM&gt;&amp;nbsp;&lt;/P&gt;
&lt;H2 data-start="1544" data-end="1586"&gt;&lt;STRONG&gt;Where Is Mutual Authentication Used?&lt;/STRONG&gt;&lt;/H2&gt;
&lt;P data-start="1588" data-end="1738"&gt;It’s not something you’ll see every time you browse Website or order food. This is more of a high-security feature used when it really matters, like:&lt;/P&gt;
&lt;UL data-start="1740" data-end="1958"&gt;
&lt;LI data-start="1740" data-end="1769"&gt;Banking apps or APIs&lt;/LI&gt;
&lt;LI data-start="1770" data-end="1799"&gt;Healthcare platforms&lt;/LI&gt;
&lt;LI data-start="1800" data-end="1853"&gt;Internal corporate tools with sensitive data&lt;/LI&gt;
&lt;LI data-start="1854" data-end="1898"&gt;VPN connections to internal systems&lt;/LI&gt;
&lt;LI data-start="1899" data-end="1958"&gt;Server-to-server communications (backend services)&lt;/LI&gt;
&lt;/UL&gt;
&lt;P data-start="1960" data-end="2062"&gt;If you’re dealing with anything highly sensitive or regulated — mutual TLS (mTLS) is your best friend.&lt;/P&gt;
&lt;H2 data-start="234" data-end="301"&gt;&lt;STRONG&gt;What You’ll Need to Get Started (Before Setting It Up in IIS)&lt;/STRONG&gt;&lt;/H2&gt;
&lt;P data-start="303" data-end="443"&gt;Before we dive into mutual authentication setup in IIS, let’s make sure your toolbox is ready. Here's what you absolutely need in place:&lt;/P&gt;
&lt;H3 data-start="445" data-end="485"&gt;1. SSL Certificates on Both Ends&lt;/H3&gt;
&lt;UL data-start="486" data-end="690"&gt;
&lt;LI data-start="486" data-end="586"&gt;&lt;STRONG data-start="488" data-end="510"&gt;Server Certificate&lt;/STRONG&gt;: This goes on your IIS server. It authenticates the server to the client.&lt;/LI&gt;
&lt;LI data-start="587" data-end="690"&gt;&lt;STRONG data-start="589" data-end="614"&gt;Client Certificate(s)&lt;/STRONG&gt;: Each client needs its own certificate to prove its identity to the server.&lt;/LI&gt;
&lt;/UL&gt;
&lt;P data-start="694" data-end="786"&gt;&lt;EM data-start="697" data-end="786"&gt;Think of this like both sides showing their ID cards before entering a secure building.&lt;/EM&gt;&lt;/P&gt;
&lt;H3 data-start="788" data-end="833"&gt;2. Trusted Certificate Authority (CA)&lt;/H3&gt;
&lt;UL data-start="834" data-end="1033"&gt;
&lt;LI data-start="834" data-end="913"&gt;All certificates should be issued by a trusted CA (public or internal).&lt;/LI&gt;
&lt;LI data-start="914" data-end="1033"&gt;If you're using self-signed certs, make sure the full trust chain is manually imported on both client and server.&lt;/LI&gt;
&lt;/UL&gt;
&lt;P data-start="1037" data-end="1121"&gt;&lt;EM data-start="1041" data-end="1121"&gt;If the cert isn’t trusted, the handshake breaks right there—no second chances.&lt;/EM&gt;&lt;/P&gt;
&lt;H3 data-start="1123" data-end="1159"&gt;3. IIS Configured with HTTPS&lt;/H3&gt;
&lt;UL data-start="1160" data-end="1309"&gt;
&lt;LI data-start="1160" data-end="1231"&gt;IIS must be up and running with HTTPS bindings properly set up.&lt;/LI&gt;
&lt;LI data-start="1232" data-end="1309"&gt;Make sure the server cert is already installed and bound to the right site.&lt;/LI&gt;
&lt;/UL&gt;
&lt;H3 data-start="1311" data-end="1335"&gt;4. Port 443 Open&lt;/H3&gt;
&lt;UL data-start="1336" data-end="1448"&gt;
&lt;LI data-start="1336" data-end="1412"&gt;Your firewall should allow inbound and outbound traffic on port 443.&lt;/LI&gt;
&lt;LI data-start="1413" data-end="1448"&gt;No HTTPS = No TLS = No handshake.&lt;/LI&gt;
&lt;/UL&gt;
&lt;H3 data-start="1450" data-end="1494"&gt;5. Clients That Support Certificates&lt;/H3&gt;
&lt;UL data-start="1495" data-end="1666"&gt;
&lt;LI data-start="1495" data-end="1563"&gt;Not all browsers or systems send client certificates by default.&lt;/LI&gt;
&lt;LI data-start="1564" data-end="1666"&gt;Make sure your client device, browser, or app supports and presents certificates when requested.&lt;/LI&gt;
&lt;/UL&gt;
&lt;P data-start="1670" data-end="1764"&gt;&lt;EM data-start="1673" data-end="1764"&gt;Chrome and Edge usually prompt for a certificate; some browsers need extra setup.&lt;/EM&gt;&lt;/P&gt;
&lt;H2 data-start="2648" data-end="2713"&gt;&lt;STRONG&gt;Step-by-Step: How to Configure Mutual Authentication in IIS&lt;/STRONG&gt;&lt;/H2&gt;
&lt;P data-start="2715" data-end="2783"&gt;Let’s walk through this like I’m helping you set it up from scratch.&lt;/P&gt;
&lt;H3 data-start="2785" data-end="2839"&gt;Step 1: Install and Bind the Server Certificate&lt;/H3&gt;
&lt;UL data-start="2841" data-end="3044"&gt;
&lt;LI data-start="2841" data-end="2895"&gt;Open&lt;STRONG&gt; &lt;/STRONG&gt;IIS Manager → Go to Server Certificates&lt;/LI&gt;
&lt;LI data-start="2896" data-end="2950"&gt;Install the certificate (issued to your domain name)&lt;/LI&gt;
&lt;LI data-start="2951" data-end="3044"&gt;Go to your site → Bindings → Add or Edit binding for https and choose the certificate&lt;/LI&gt;
&lt;/UL&gt;
&lt;H3 data-start="3046" data-end="3104"&gt;Step 2: Generate and Distribute Client Certificates&lt;/H3&gt;
&lt;UL data-start="3106" data-end="3304"&gt;
&lt;LI data-start="3106" data-end="3181"&gt;Create client certificates via your internal CA or a trusted 3rd-party CA&lt;/LI&gt;
&lt;LI data-start="3182" data-end="3304"&gt;Export them securely (with private key) and import them into clients under:
&lt;UL data-start="3262" data-end="3304"&gt;
&lt;LI data-start="3262" data-end="3304"&gt;Current User &amp;gt; Personal &amp;gt; Certificates&lt;/LI&gt;
&lt;/UL&gt;
&lt;/LI&gt;
&lt;/UL&gt;
&lt;H3 data-start="3306" data-end="3350"&gt;Step 3: Configure SSL Settings in IIS&lt;/H3&gt;
&lt;UL data-start="3352" data-end="3492"&gt;
&lt;LI data-start="3352" data-end="3390"&gt;In IIS Manager, select your site&lt;/LI&gt;
&lt;LI data-start="3391" data-end="3415"&gt;Go to SSL Settings&lt;/LI&gt;
&lt;LI data-start="3416" data-end="3439"&gt;Check Require SSL&lt;/LI&gt;
&lt;LI data-start="3440" data-end="3492"&gt;Under&amp;nbsp;Client Certificates, choose Require&lt;/LI&gt;
&lt;/UL&gt;
&lt;P data-start="3494" data-end="3665"&gt;That’s the key switch — when you hit "Require", IIS won’t just accept any request — it will &lt;EM data-start="3586" data-end="3594"&gt;demand&lt;/EM&gt; a client certificate. If the client doesn’t provide one, it’s goodbye.&lt;/P&gt;
&lt;H3 data-start="3667" data-end="3730"&gt;Step 4: Configure Authorization (Optional but Important)&lt;/H3&gt;
&lt;UL data-start="3732" data-end="3900"&gt;
&lt;LI data-start="3732" data-end="3784"&gt;Go to IIS &amp;gt; Feature View &amp;gt; Authorization Rules&lt;/LI&gt;
&lt;LI data-start="3785" data-end="3900"&gt;You can allow or deny based on specific certificates or mapped Windows users (via Client Certificate Mapping)&lt;/LI&gt;
&lt;/UL&gt;
&lt;H3&gt;Step 5: Enable Client Certificate Mapping via IIS Config Editor&lt;/H3&gt;
&lt;P data-start="906" data-end="953"&gt;Let’s go into the config editor and turn it on.&lt;/P&gt;
&lt;OL data-start="955" data-end="1535"&gt;
&lt;LI data-start="955" data-end="979"&gt;Open IIS Manager.&lt;/LI&gt;
&lt;LI data-start="980" data-end="1007"&gt;Select your website.&lt;/LI&gt;
&lt;LI data-start="1008" data-end="1075"&gt;In the Features View, double-click Configuration Editor.&lt;/LI&gt;
&lt;LI data-start="1076" data-end="1231"&gt;In the Section dropdown at the top, navigate to:&lt;BR /&gt;&lt;BR /&gt;
&lt;DIV class="styles_lia-table-wrapper__h6Xo9 styles_table-responsive__MW0lN"&gt;&lt;table border="1" style="width: 100%; border-width: 1px;"&gt;&lt;colgroup&gt;&lt;col style="width: 99.9038%" /&gt;&lt;/colgroup&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;BR /&gt;system.webServer/security/authentication/iisClientCertificateMappingAuthentication&lt;BR /&gt;&amp;nbsp;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/DIV&gt;
&lt;BR /&gt;&lt;BR /&gt;&lt;/LI&gt;
&lt;LI data-start="1076" data-end="1231"&gt;Set:&lt;/LI&gt;
&lt;/OL&gt;
&lt;UL&gt;
&lt;LI style="list-style-type: none;"&gt;
&lt;UL data-start="1243" data-end="1432"&gt;
&lt;LI data-start="1243" data-end="1264"&gt;enabled: &lt;STRONG data-start="1256" data-end="1264"&gt;True&lt;/STRONG&gt;&lt;/LI&gt;
&lt;LI data-start="1268" data-end="1347"&gt;oneToOneCertificateMappingsEnabled: &lt;STRONG data-start="1308" data-end="1316"&gt;True&lt;/STRONG&gt; (if using one-to-one mappings)&lt;/LI&gt;
&lt;LI data-start="1351" data-end="1432"&gt;manyToOneCertificateMappingsEnabled: &lt;STRONG data-start="1392" data-end="1400"&gt;True&lt;/STRONG&gt; (if using many-to-one mappings)&lt;/LI&gt;
&lt;/UL&gt;
&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;6. Click Apply on the right pane.&lt;/P&gt;
&lt;P&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;7. Do an IIS Reset (run iisreset in CMD) to apply changes.&lt;/P&gt;
&lt;H2 data-start="1542" data-end="1601"&gt;&lt;STRONG&gt;Choose Your Mapping Method: One-to-One vs Many-to-One&lt;/STRONG&gt;&lt;/H2&gt;
&lt;H3 data-start="1603" data-end="1647"&gt;One-to-One Mapping: Precision Control&lt;/H3&gt;
&lt;P data-start="1649" data-end="1740"&gt;This is tight control: each client certificate is matched to one specific Windows user.&lt;/P&gt;
&lt;P data-start="1744" data-end="1820"&gt;Use this when: You want specific user-level access for each certificate.&lt;/P&gt;
&lt;H4 data-start="1822" data-end="1865"&gt;Steps to Set Up One-to-One Mapping:&lt;/H4&gt;
&lt;OL data-start="1867" data-end="2530"&gt;
&lt;LI data-start="1944" data-end="2020"&gt;Go to IIS &amp;gt; Client Certificate Mapping Authentication.&lt;/LI&gt;
&lt;LI data-start="2083" data-end="2187"&gt;On the Actions pane (right), click “Edit Feature Settings…”:
&lt;UL data-start="2158" data-end="2187"&gt;
&lt;LI data-start="2158" data-end="2187"&gt;Ensure “Enable” is checked.&lt;/LI&gt;
&lt;/UL&gt;
&lt;/LI&gt;
&lt;LI data-start="2188" data-end="2242"&gt;Click “One-to-One Mappings…” in the right pane.&lt;/LI&gt;
&lt;LI data-start="2243" data-end="2530"&gt;In the One-to-One dialog:
&lt;UL data-start="2275" data-end="2530"&gt;
&lt;LI data-start="2275" data-end="2291"&gt;Click Add.&lt;/LI&gt;
&lt;LI data-start="2295" data-end="2371"&gt;Browse and select the client certificate file (usually a .cer file).&lt;/LI&gt;
&lt;LI data-start="2375" data-end="2495"&gt;Provide the Windows account to map this cert to.
&lt;UL data-start="2435" data-end="2495"&gt;
&lt;LI data-start="2435" data-end="2495"&gt;Can be local (.\username) or domain (DOMAIN\username).&lt;/LI&gt;
&lt;/UL&gt;
&lt;/LI&gt;
&lt;LI data-start="2499" data-end="2530"&gt;Enter the password if needed.&lt;/LI&gt;
&lt;/UL&gt;
&lt;/LI&gt;
&lt;/OL&gt;
&lt;P data-start="2532" data-end="2598"&gt;Done! That specific certificate now logs in as that mapped user.&lt;/P&gt;
&lt;H3 data-start="2605" data-end="2647"&gt;Many-to-One Mapping: Broad Grouping&lt;/H3&gt;
&lt;P data-start="2649" data-end="2766"&gt;This is looser control: match multiple client certs using rules (e.g., same issuer) to a single Windows user.&lt;/P&gt;
&lt;P data-start="2770" data-end="2868"&gt;Use this when: You want to group multiple clients under a single identity, like a shared role.&lt;/P&gt;
&lt;H4 data-start="2870" data-end="2914"&gt;Steps to Set Up Many-to-One Mapping:&lt;/H4&gt;
&lt;OL data-start="2916" data-end="3506"&gt;
&lt;LI data-start="2916" data-end="2956"&gt;In IIS Manager, select your site.&lt;/LI&gt;
&lt;LI data-start="2957" data-end="3018"&gt;Go to IIS &amp;gt; Client Certificate Mapping Authentication.&lt;/LI&gt;
&lt;LI data-start="3019" data-end="3074"&gt;Click “Many-to-One Mappings…” in the right pane.&lt;/LI&gt;
&lt;LI data-start="3075" data-end="3375"&gt;In the Many-to-One dialog:
&lt;UL&gt;
&lt;LI style="list-style-type: none;"&gt;
&lt;OL data-start="1359" data-end="1784"&gt;
&lt;LI data-start="1359" data-end="1417"&gt;In the editor, click Add (adds a new mapping item).&lt;/LI&gt;
&lt;LI data-start="1418" data-end="1784"&gt;Configure the following properties:
&lt;UL data-start="1460" data-end="1784"&gt;
&lt;LI data-start="1460" data-end="1481"&gt;enabled: True&lt;/LI&gt;
&lt;LI data-start="1485" data-end="1550"&gt;name: A friendly name for this rule (e.g., FinanceCertRule)&lt;/LI&gt;
&lt;LI data-start="1554" data-end="1601"&gt;permissions: Usually leave default (Read)&lt;/LI&gt;
&lt;LI data-start="1605" data-end="1685"&gt;userName: The Windows account this cert maps to (e.g., DOMAIN\financeuser)&lt;/LI&gt;
&lt;LI data-start="1689" data-end="1727"&gt;password: Password for the account&lt;/LI&gt;
&lt;LI data-start="1731" data-end="1784"&gt;rules: Click (…) to open the Rules collection&lt;/LI&gt;
&lt;/UL&gt;
&lt;/LI&gt;
&lt;/OL&gt;
&lt;H3 class="lia-align-left" data-start="1791" data-end="1862"&gt;Step-by-Step Inside rules → Add a Certificate Field Match Rule&lt;/H3&gt;
&lt;P data-start="1864" data-end="1923"&gt;Now you’re defining what to match from the certificate.&lt;/P&gt;
&lt;OL data-start="1925" data-end="2015"&gt;
&lt;LI data-start="1925" data-end="1976"&gt;In the rules collection editor, click Add.&lt;/LI&gt;
&lt;LI data-start="1977" data-end="2015"&gt;Now configure the following fields:&lt;/LI&gt;
&lt;/OL&gt;
&lt;DIV class="styles_lia-table-wrapper__h6Xo9 styles_table-responsive__MW0lN"&gt;&lt;table border="1" style="width: 100%; height: 229.333px; border-width: 1px;"&gt;&lt;thead&gt;&lt;tr style="height: 26.6667px;"&gt;&lt;th style="height: 26.6667px;"&gt;Property&lt;/th&gt;&lt;th style="height: 26.6667px;"&gt;Example Value&lt;/th&gt;&lt;th style="height: 26.6667px;"&gt;Description&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr style="height: 74.6667px;"&gt;&lt;td style="height: 74.6667px;"&gt;certificateField&lt;/td&gt;&lt;td style="height: 74.6667px;"&gt;Subject or Issuer&lt;/td&gt;&lt;td style="height: 74.6667px;"&gt;Which X.509 field to inspect. Common ones: Subject, Issuer, SerialNumber, SubjectAltName&lt;/td&gt;&lt;/tr&gt;&lt;tr style="height: 50.6667px;"&gt;&lt;td style="height: 50.6667px;"&gt;certificateSubField&lt;/td&gt;&lt;td style="height: 50.6667px;"&gt;CN (Common Name), O, etc.&lt;/td&gt;&lt;td style="height: 50.6667px;"&gt;Specific sub-field. For Subject: CN, OU, O, etc.&lt;/td&gt;&lt;/tr&gt;&lt;tr style="height: 50.6667px;"&gt;&lt;td style="height: 50.6667px;"&gt;matchCriteria&lt;/td&gt;&lt;td style="height: 50.6667px;"&gt;FinanceUser001&lt;/td&gt;&lt;td style="height: 50.6667px;"&gt;The value to compare to (e.g., subject CN)&lt;/td&gt;&lt;/tr&gt;&lt;tr style="height: 26.6667px;"&gt;&lt;td style="height: 26.6667px;"&gt;compareCaseSensitive&lt;/td&gt;&lt;td style="height: 26.6667px;"&gt;True or False&lt;/td&gt;&lt;td style="height: 26.6667px;"&gt;Should the match be case-sensitive?&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/DIV&gt;
&lt;P data-start="2683" data-end="2739"&gt;&lt;BR /&gt;Example: Match on Subject → CN → FinanceUser001&lt;/P&gt;
&lt;P data-start="2741" data-end="2792"&gt;That means if a client presents a certificate with:&lt;/P&gt;
&lt;P&gt;Subject: CN=FinanceUser001, OU=Finance, O=ExampleCorp&lt;/P&gt;
&lt;P data-start="2855" data-end="2930"&gt;then the client will be mapped to the Windows user DOMAIN\financeuser.&lt;/P&gt;
&lt;P data-start="2932" data-end="3062"&gt;&amp;nbsp;&lt;/P&gt;
&lt;/LI&gt;
&lt;LI style="list-style-type: none;"&gt;&amp;nbsp;&lt;/LI&gt;
&lt;/UL&gt;
&lt;/LI&gt;
&lt;/OL&gt;
&lt;UL&gt;
&lt;LI&gt;Click OK on the rules editor.&lt;/LI&gt;
&lt;LI&gt;Click OK on the mappings editor.&lt;/LI&gt;
&lt;LI&gt;Click Apply back in the Configuration Editor.&lt;/LI&gt;
&lt;/UL&gt;
&lt;H2 data-start="3907" data-end="3930"&gt;Testing the Setup&lt;/H2&gt;
&lt;P data-start="3932" data-end="4020"&gt;Try accessing your site from a browser &lt;EM data-start="3971" data-end="3977"&gt;with&lt;/EM&gt; a valid client certificate. You’ll either:&lt;/P&gt;
&lt;UL data-start="4022" data-end="4167"&gt;
&lt;LI data-start="4022" data-end="4086"&gt;Be prompted to choose a certificate (browser pops up a dialog)&lt;/LI&gt;
&lt;LI data-start="4087" data-end="4108"&gt;Get in successfully&lt;/LI&gt;
&lt;LI data-start="4109" data-end="4167"&gt;Or get a 403 Forbidden error if the cert isn’t valid&lt;/LI&gt;
&lt;/UL&gt;
&lt;H2 data-start="4174" data-end="4253"&gt;Let’s Open NetMon: What Does Mutual Authentication Look Like on the Wire?&lt;/H2&gt;
&lt;P data-start="4255" data-end="4435"&gt;Now comes the fun part —&lt;STRONG&gt; &lt;/STRONG&gt;network tracing. If you want to &lt;EM data-start="4316" data-end="4321"&gt;see&lt;/EM&gt; mutual authentication in action, here's how you do it in Microsoft Network Monitor (NetMon) or Wireshark.&lt;/P&gt;
&lt;H3 data-start="4597" data-end="4639"&gt;Sample Mutual Auth Flow (2-Way SSL)&lt;/H3&gt;
&lt;P data-start="4641" data-end="4710"&gt;Here’s what you’ll see in a successful mutual authentication session:&lt;/P&gt;
&lt;DIV class="styles_lia-table-wrapper__h6Xo9 styles_table-responsive__MW0lN"&gt;&lt;table style="width: 100%; height: 258.334px;"&gt;&lt;tbody&gt;&lt;tr style="height: 26.6667px;"&gt;&lt;td style="height: 26.6667px;"&gt;&lt;SPAN class="lia-text-color-6"&gt;TLS:TLS Rec Layer-1 HandShake: Client Hello.&lt;/SPAN&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style="height: 50.6667px;"&gt;&lt;td style="height: 50.6667px;"&gt;&lt;SPAN class="lia-text-color-15"&gt;TLS:TLS Rec Layer-1 HandShake: Server Hello.; TLS Rec Layer-2 HandShake: Certificate. TLS Rec Layer-3 HandShake: CertificateRequest.; TLS Rec Layer-4 HandShake: ServerHelloDone.&lt;/SPAN&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style="height: 26.6667px;"&gt;&lt;td style="height: 26.6667px;"&gt;&lt;SPAN class="lia-text-color-15"&gt;TLS:Continued Data: 1378 Bytes&lt;/SPAN&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style="height: 50.6667px;"&gt;&lt;td style="height: 50.6667px;"&gt;&lt;SPAN class="lia-text-color-8"&gt;TLS:TLS Rec Layer-1 HandShake: Certificate.; TLS Rec Layer-2 HandShake: Client Key Exchange.; TLS Rec Layer-3 HandShake: Certificate Verify.; TLS Rec Layer-4 Cipher Change Spec; TLS Rec Layer-5 HandShake: Encrypted Handshake Message.&lt;/SPAN&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style="height: 23.6667px;"&gt;&lt;td style="height: 23.6667px;"&gt;&lt;SPAN class="lia-text-color-14"&gt;TLS:TLS Rec Layer-1 HandShake: Encrypted Handshake Message.; TLS Rec Layer-2 Cipher Change Spec; TLS Rec Layer-3 HandShake: Encrypted Handshake Message.&lt;/SPAN&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style="height: 26.6667px;"&gt;&lt;td style="height: 26.6667px;"&gt;TLS:TLS Rec Layer-1 SSL Application Data&lt;/td&gt;&lt;/tr&gt;&lt;tr style="height: 26.6667px;"&gt;&lt;td style="height: 26.6667px;"&gt;TLS:TLS Rec Layer-1 SSL Application Data&lt;/td&gt;&lt;/tr&gt;&lt;tr style="height: 26.6667px;"&gt;&lt;td style="height: 26.6667px;"&gt;TLS:TLS Rec Layer-1 SSL Application Data&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/DIV&gt;
&lt;DIV class="styles_lia-table-wrapper__h6Xo9 styles_table-responsive__MW0lN"&gt;&amp;nbsp;&lt;/DIV&gt;
&lt;H3 data-start="5196" data-end="5224"&gt;Key Things to Notice:&lt;/H3&gt;
&lt;H4 data-start="5226" data-end="5280"&gt;Frame 2:&amp;nbsp;&lt;STRONG data-start="5242" data-end="5280"&gt;Server Hello + Certificate Request&lt;/STRONG&gt;&lt;/H4&gt;
&lt;UL data-start="5281" data-end="5483"&gt;
&lt;LI data-start="5281" data-end="5334"&gt;This is the giveaway that mutual auth is happening.&lt;/LI&gt;
&lt;LI data-start="5335" data-end="5414"&gt;The Certificate Request from server is &lt;EM data-start="5378" data-end="5383"&gt;not&lt;/EM&gt; present in normal one-way SSL.&lt;/LI&gt;
&lt;LI data-start="5415" data-end="5483"&gt;It tells the client: "Hey — now you give me your certificate too."&lt;/LI&gt;
&lt;/UL&gt;
&lt;H4 data-start="5485" data-end="5538"&gt;Frame 3:&amp;nbsp;&lt;STRONG data-start="5501" data-end="5538"&gt;Client Certificate &amp;amp; Verification&lt;/STRONG&gt;&lt;/H4&gt;
&lt;UL data-start="5539" data-end="5763"&gt;
&lt;LI data-start="5539" data-end="5585"&gt;The client responds with its certificate&lt;/LI&gt;
&lt;LI data-start="5586" data-end="5763"&gt;Followed by:
&lt;UL data-start="5603" data-end="5763"&gt;
&lt;LI data-start="5603" data-end="5652"&gt;Client Key Exchange (sends Pre-Master Secret)&lt;/LI&gt;
&lt;LI data-start="5655" data-end="5711"&gt;Certificate Verify (proves ownership of private key)&lt;/LI&gt;
&lt;LI data-start="5714" data-end="5763"&gt;Change Cipher Spec (switch to encrypted mode)&lt;/LI&gt;
&lt;/UL&gt;
&lt;/LI&gt;
&lt;/UL&gt;
&lt;H4 data-start="5765" data-end="5800"&gt;Frame 4:&amp;nbsp;&lt;STRONG data-start="5781" data-end="5800"&gt;Server Finished&lt;/STRONG&gt;&lt;/H4&gt;
&lt;UL data-start="5801" data-end="5866"&gt;
&lt;LI data-start="5801" data-end="5866"&gt;Server finishes handshake and both sides can now securely talk.&lt;/LI&gt;
&lt;/UL&gt;
&lt;H4 data-start="5873" data-end="5898"&gt;If Something Fails:&lt;/H4&gt;
&lt;P data-start="5900" data-end="5909"&gt;Check if:&lt;/P&gt;
&lt;UL data-start="5910" data-end="6193"&gt;
&lt;LI data-start="5910" data-end="5991"&gt;Frame 2 is missing Certificate Request → server isn’t asking for client cert.&lt;/LI&gt;
&lt;LI data-start="5992" data-end="6095"&gt;Frame 3 doesn’t have Certificate → client didn’t send it (wrong browser, cert missing, not trusted)&lt;/LI&gt;
&lt;LI data-start="6096" data-end="6193"&gt;You get a TLS Alert packet (e.g., “bad certificate”) → cert mismatch, expired, or not mapped.&lt;/LI&gt;
&lt;/UL&gt;
&lt;H3 data-start="6200" data-end="6236"&gt;Where Are Certificates Stored?&lt;/H3&gt;
&lt;P data-start="6238" data-end="6265"&gt;Here’s a quick cheat sheet:&lt;/P&gt;
&lt;DIV class="styles_lia-table-wrapper__h6Xo9 styles_table-responsive__MW0lN"&gt;&lt;table border="1" style="border-width: 1px;"&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Certificate Type&lt;/th&gt;&lt;th&gt;Location&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Server Certificate&lt;/td&gt;&lt;td&gt;Local Machine &amp;gt; Personal&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Client Certificate&lt;/td&gt;&lt;td&gt;Current User &amp;gt; Personal&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Trusted Root CAs&lt;/td&gt;&lt;td&gt;Local Machine &amp;gt; Trusted Root Certification Authorities&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/DIV&gt;
&lt;P data-start="6634" data-end="6658"&gt;You can open them using:&lt;/P&gt;
&lt;P&gt;run -&amp;gt; certmgr.msc&amp;nbsp; &amp;nbsp;or&lt;BR data-start="6686" data-end="6689" /&gt;Use MMC Console → Add/Remove Snap-In → Certificates&lt;/P&gt;
&lt;H2 data-start="6751" data-end="6790"&gt;Logs to Check If It’s Not Working&lt;/H2&gt;
&lt;P data-start="6792" data-end="6866"&gt;Trust me, when mutual TLS fails, you’ll want all the logs. Start here:&lt;/P&gt;
&lt;H4 data-start="6868" data-end="6884"&gt;IIS Logs:&lt;/H4&gt;
&lt;UL data-start="6885" data-end="6997"&gt;
&lt;LI data-start="6885" data-end="6929"&gt;Found at C:\inetpub\logs\LogFiles\W3SVCx&lt;/LI&gt;
&lt;LI data-start="6930" data-end="6997"&gt;Check for status codes like 403.7 (Client certificate required)&lt;/LI&gt;
&lt;/UL&gt;
&lt;H4 data-start="6999" data-end="7019"&gt;Event Viewer:&lt;/H4&gt;
&lt;UL data-start="7020" data-end="7170"&gt;
&lt;LI data-start="7020" data-end="7058"&gt;Windows Logs → System or Application&lt;/LI&gt;
&lt;LI data-start="7059" data-end="7170"&gt;Look for Schannel errors — they give hints like "certificate expired" or "unable to find revocation list"&lt;/LI&gt;
&lt;/UL&gt;
&lt;H3 data-start="7172" data-end="7208"&gt;Wireshark or NetMon Captures:&lt;/H3&gt;
&lt;H4 data-start="7282" data-end="7303"&gt;Browser Debug:&lt;/H4&gt;
&lt;UL data-start="7304" data-end="7427"&gt;
&lt;LI data-start="7304" data-end="7335"&gt;Open dev tools → Security tab&lt;/LI&gt;
&lt;LI data-start="7336" data-end="7427"&gt;You’ll often see messages like “No client certificate presented” or “Invalid certificate”&lt;/LI&gt;
&lt;/UL&gt;
&lt;H2 data-start="7434" data-end="7454"&gt;&lt;STRONG&gt;Wrapping It Up&lt;/STRONG&gt;&lt;/H2&gt;
&lt;P data-start="7456" data-end="7716"&gt;Mutual authentication in IIS is one of those things that sounds scary but is actually really straightforward when you break it down. It's like upgrading from just checking someone's ID to both of you checking each other's passports before sitting down to talk.&lt;/P&gt;
&lt;P data-start="7718" data-end="7721"&gt;By:&lt;/P&gt;
&lt;UL data-start="7722" data-end="7876"&gt;
&lt;LI data-start="7722" data-end="7754"&gt;Installing proper certificates&lt;/LI&gt;
&lt;LI data-start="7755" data-end="7800"&gt;Configuring IIS to require client certs&lt;/LI&gt;
&lt;LI data-start="7801" data-end="7839"&gt;Verifying handshake using NetMon&lt;/LI&gt;
&lt;LI data-start="7840" data-end="7876"&gt;Checking logs when things go wrong&lt;/LI&gt;
&lt;/UL&gt;
&lt;P data-start="7878" data-end="7988"&gt;You can set up a super secure environment that ensures only trusted clients can talk to your servers.&lt;/P&gt;
&lt;H4 data-start="7995" data-end="8012"&gt;Need Help?&lt;/H4&gt;
&lt;P data-start="8014" data-end="8191"&gt;Drop a question below and I’ll help help answer it for you!&lt;BR /&gt;Happy learning&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Tue, 02 Sep 2025 16:18:41 GMT</pubDate>
      <guid>https://techcommunity.microsoft.com/t5/iis-support-blog/mutual-authentication-in-iis/ba-p/4413390</guid>
      <dc:creator>meenakshiBalekar</dc:creator>
      <dc:date>2025-09-02T16:18:41Z</dc:date>
    </item>
    <item>
      <title>Addressing TLS 1.3 Compatibility Issues in IIS Express on Windows 11</title>
      <link>https://techcommunity.microsoft.com/t5/iis-support-blog/addressing-tls-1-3-compatibility-issues-in-iis-express-on/ba-p/4449362</link>
      <description>&lt;P&gt;As Windows 10 approaches its end-of-support, these issues are becoming more prevalent as this problem has always existed on Win11. This guide will help you identify the symptoms, understand the causes, and explore potential solutions to resolve these client certificate problems in IIS Express on Win11.&lt;/P&gt;
&lt;P&gt;Note: many of the concepts will apply to both full IIS and IIS Express, on Windows 11 and Windows Server 2022 and 2025; but this post's focus is on &lt;STRONG&gt;IIS Express on workstations.&lt;/STRONG&gt;&lt;/P&gt;
&lt;H1&gt;Symptom&lt;/H1&gt;
&lt;P&gt;When launching a web app in IIS Express, the error you see if you're affected by this problem depends on which build of Win11 you're on.&lt;/P&gt;
&lt;H3&gt;Windows 11 24H2 or newer (and Windows Server 2025):&lt;/H3&gt;
&lt;img&gt;IIS detailed error page showing HTTP 500.0 Internal Server Error with the error code 0x80070032 originating from the IIS Web Core module&lt;/img&gt;
&lt;P&gt;The error code 0x80070032 translates to ERROR_NOT_SUPPORTED.&lt;/P&gt;
&lt;H3&gt;Windows 11 &lt;EM&gt;Before&lt;/EM&gt; 24H2 (and Windows Server 2022):&lt;/H3&gt;
&lt;img&gt;Standard Microsoft Edge error page showing error: "ERR_CONNECTION_RESET"&lt;/img&gt;
&lt;P&gt;The main error there is "ERR_CONNECTION_RESET" indicating the browser's connection was unexpectedly terminated via receiving a TCP RST.&lt;/P&gt;
&lt;H1&gt;Cause&lt;/H1&gt;
&lt;P&gt;Most likely at some point in the past, the &lt;EM&gt;applicationhost.config&lt;/EM&gt; file used by IIS Express was manually modified to include the below lines in some form:&lt;/P&gt;
&lt;BLOCKQUOTE&gt;
&lt;PRE&gt;&amp;lt;location path="" overrideMode="Allow"&amp;gt;&lt;BR /&gt;  &amp;lt;system.webServer&amp;gt;&lt;BR /&gt;  &amp;nbsp; &amp;lt;security&amp;gt;&lt;BR /&gt;  &amp;nbsp; &amp;nbsp; &amp;lt;access sslFlags="SslNegotiateCert" /&amp;gt;&lt;BR /&gt;  &amp;nbsp; &amp;lt;/security&amp;gt;&lt;/PRE&gt;
&lt;/BLOCKQUOTE&gt;
&lt;P&gt;One common place for this file is here:&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;[solution directory]\.vs\[project name]\config\applicationhost.config&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;The critical line is #4 with the "&lt;STRONG&gt;SslNegotiateCert&lt;/STRONG&gt;" option. This could also have "&lt;STRONG&gt;SslRequireCert&lt;/STRONG&gt;" to experience the same issue. By default, those sslFlags are not set in the file. Those options ("SslNegotiateCert" or "SslRequireCert") tell IIS Express, at the beginning of processing a request, to check for a client certificate. Unfortunately, at this time, that will not work on Windows 11 without some kind of workaround.&lt;/P&gt;
&lt;P&gt;The underlying cause here is the use of TLS 1.3 by default for inbound and outbound traffic on Win11, and TLS 1.3 does not support a TLS concept known as "renegotiation." This is the same problem detailed by JasonXu in&amp;nbsp;&lt;A class="lia-internal-link lia-internal-url lia-internal-url-content-type-blog" href="https://techcommunity.microsoft.com/blog/iis-support-blog/windows-server-2022-iis-web-site-tls-1-3-does-not-work-with-client-certificate-a/4129738" target="_blank" rel="noopener" data-lia-auto-title="this post" data-lia-auto-title-active="0"&gt;this post&lt;/A&gt; for Windows Server 2022 with full IIS. With this post being about IIS Express, which works differently and is managed differently than full IIS, the solutions will be mostly different here. If you want more background and technical details on how this works, continue reading past the "Solution" section below. There I will also explain the differences in symptoms/errors on the different Win11 builds.&lt;/P&gt;
&lt;H1&gt;Solutions&lt;/H1&gt;
&lt;P&gt;At the time of this writing, in late August 2025, there is no quick fix in IIS Express or the VS solution/project. I am honestly not sure if there will be a fix and what it will look like if there is. For now, there are a few ways to work around this:&lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;Disable TLS 1.3 for&amp;nbsp;&lt;EM&gt;inbound/server&amp;nbsp;&lt;/EM&gt;sessions on the workstation. I recommend this over other workarounds since it requires no code or any changes to the app or solution/project, and only affects &lt;STRONG&gt;inbound&lt;/STRONG&gt; TLS traffic (which is typically minimal on workstations). Any outbound traffic from your browsers or any other clients won't be affected. The downside is this is machine-wide. Again, this shouldn't be a problem since on a workstation there shouldn't be anything depending on inbound TLS 1.3 specifically; however, your scenario may be different.&lt;/LI&gt;
&lt;LI&gt;Update the http.sys binding via &lt;EM&gt;netsh&lt;/EM&gt; to negotiate a client certificate in in the initial TLS handshake. A potential problem with this, in my opinion, is since these bindings are setup during the Visual Studio installation process (I believe), updates or changes to VS might also update these bindings and reset them to a default state, undoing your changes. I honestly don't know if this would happen and I did not test it, so it may not be a problem at all. You should be able to modify just the one binding as well. Doing this requires an administrative command prompt.&lt;/LI&gt;
&lt;LI&gt;Undo/Remove the client cert configuration in the aforementioned&amp;nbsp;&lt;EM&gt;applicationhost.config&lt;/EM&gt; and modify app code to negate the need for client certs in this particular environment. This could get complicated and messy, but it's certainly an option.&lt;/LI&gt;
&lt;/OL&gt;
&lt;P&gt;If anything changes or other solutions come up, I will update this post if possible.&lt;/P&gt;
&lt;H3&gt;Solution #1 - Disable inbound TLS 1.3&lt;/H3&gt;
&lt;P&gt;This is done via the registry. Using your method of choice (Group Policy Preferences, .reg file, PowerShell, manually, etc.), make the below changes:&lt;/P&gt;
&lt;BLOCKQUOTE&gt;
&lt;PRE&gt;HKLM\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.3\Server&lt;BR /&gt;REG_DWORD "DisabledByDefault" = 1&lt;BR /&gt;REG_DWORD "Enabled" = 0&lt;/PRE&gt;
&lt;/BLOCKQUOTE&gt;
&lt;P&gt;Note: depending on prior configurations, the entire path above may not exist. Just create any missing folders/keys.&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Here are some PowerShell commands to do it (need admin):&lt;/P&gt;
&lt;BLOCKQUOTE&gt;
&lt;PRE&gt;New-Item -Path "HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols" -Name "TLS 1.3" -ErrorAction SilentlyContinue&lt;BR /&gt;&lt;BR /&gt;New-Item -Path "HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.3" -Name "Server" -ErrorAction SilentlyContinue&lt;BR /&gt;&lt;BR /&gt;Set-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.3\Server" -Name "DisabledByDefault" -Value 1 -Type DWord&lt;BR /&gt;&lt;BR /&gt;Set-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.3\Server" -Name "Enabled" -Value 0 -Type DWord&lt;/PRE&gt;
&lt;/BLOCKQUOTE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;A reboot is needed for Schannel to pick the changes up.&amp;nbsp;&lt;/P&gt;
&lt;H3&gt;Solution #2 - Enable Client Certificate Negotiation via Netsh&lt;/H3&gt;
&lt;P&gt;For this option you would need to identify any https:// URLs in affected projects that need to be changed. One place to see it is in Visual Studio's project properties pane:&lt;/P&gt;
&lt;img&gt;screenshot showing a Visual Studio 2022 project properties pane with the "SSL URL" property highlighted, containing a value of "https://localhost:44339/"&lt;/img&gt;
&lt;P&gt;Once you have the URLs to be changed, open an&amp;nbsp;&lt;STRONG&gt;admin&lt;/STRONG&gt; command prompt (either on its own or via the Command Prompt option if using the Terminal app) and run the below command to see the current configuration for that binding, substituting the appropriate port for the one used in your project. The below command is to view the binding shown above:&lt;/P&gt;
&lt;BLOCKQUOTE&gt;
&lt;PRE&gt;C:\&amp;gt;&lt;STRONG&gt;netsh http show ssl &lt;SPAN class="lia-text-color-13"&gt;ipport=0.0.0.0:44339&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;BR /&gt;&lt;BR /&gt;SSL Certificate bindings:&lt;BR /&gt;-------------------------&lt;BR /&gt;&lt;BR /&gt;&amp;nbsp; &amp;nbsp; IP:port &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;: 0.0.0.0:44339&lt;BR /&gt;&amp;nbsp; &amp;nbsp; Certificate Hash &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; : 92e10294489ad41c2a773403b8bc4cd166b03dc6&lt;BR /&gt;&amp;nbsp; &amp;nbsp; Application ID &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; : {214124cd-d05b-4309-9af9-9caa44b2b74a}&lt;BR /&gt;&amp;nbsp; &amp;nbsp; Certificate Store Name &amp;nbsp; &amp;nbsp; &amp;nbsp; : MY&lt;BR /&gt;&amp;nbsp; &amp;nbsp; Verify Client Certificate Revocation : Enabled&lt;BR /&gt;&amp;nbsp; &amp;nbsp; Verify Revocation Using Cached Client Certificate Only : Disabled&lt;BR /&gt;&amp;nbsp; &amp;nbsp; Use Revocation Freshness Time : Disabled&lt;BR /&gt;&amp;nbsp; &amp;nbsp; Verify Revocation Using Cached URLs Only : Disabled&lt;BR /&gt;&amp;nbsp; &amp;nbsp; Disable Authority Info Access : Disabled&lt;BR /&gt;&amp;nbsp; &amp;nbsp; Usage Check &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;: Enabled&lt;BR /&gt;&amp;nbsp; &amp;nbsp; Revocation Freshness Time &amp;nbsp; &amp;nbsp;: 0&lt;BR /&gt;&amp;nbsp; &amp;nbsp; URL Retrieval Timeout &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;: 0&lt;BR /&gt;&amp;nbsp; &amp;nbsp; Ctl Identifier &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; : (null)&lt;BR /&gt;&amp;nbsp; &amp;nbsp; Ctl Store Name &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; : (null)&lt;BR /&gt;&amp;nbsp; &amp;nbsp; DS Mapper Usage &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;: Disabled&lt;BR /&gt;  &amp;nbsp; &lt;SPAN class="lia-text-color-13"&gt;Negotiate Client Certificate : Disabled&lt;/SPAN&gt;&lt;BR /&gt;&amp;nbsp; &amp;nbsp; Reject Connections &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; : Disabled&lt;BR /&gt;&amp;nbsp; &amp;nbsp; Disable HTTP2 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;: Not Set&lt;BR /&gt;&amp;nbsp; &amp;nbsp; Disable QUIC &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; : Not Set&lt;BR /&gt;&amp;nbsp; &amp;nbsp; Disable TLS1.2 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; : Not Set&lt;BR /&gt;&amp;nbsp; &amp;nbsp; Disable TLS1.3 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; : Not Set&lt;BR /&gt;  &amp;nbsp; Disable OCSP Stapling &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;: Not Set&lt;/PRE&gt;
&lt;/BLOCKQUOTE&gt;
&lt;P&gt;The "Negotiate Client Certificate" option is the one we need to change. Changing involves deleting the binding and recreating it with the property set.&amp;nbsp;&lt;STRONG&gt;You will need to make note of the Certificate Hash, Application ID, and Certificate Store Name properties to be able to recreate the binding.&lt;/STRONG&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Delete the binding:&lt;/P&gt;
&lt;BLOCKQUOTE&gt;
&lt;PRE&gt;C:\&amp;gt;&lt;STRONG&gt;netsh http delete ssl &lt;SPAN class="lia-text-color-13"&gt;ipport=0.0.0.0:44339&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;BR /&gt;&lt;BR /&gt;SSL Certificate successfully deleted&lt;/PRE&gt;
&lt;/BLOCKQUOTE&gt;
&lt;P&gt;Recreate the binding with the updated setting (this is where you need to re-enter the certificate hash, application ID, and cert store name in their respective parameters, exactly as they were before):&lt;/P&gt;
&lt;BLOCKQUOTE&gt;
&lt;PRE&gt;C:\&amp;gt;&lt;STRONG&gt;netsh http add ssl &lt;SPAN class="lia-text-color-13"&gt;ipport=0.0.0.0:44339&lt;/SPAN&gt; certhash=92e10294489ad41c2a773403b8bc4cd166b03dc6 appid={214124cd-d05b-4309-9af9-9caa44b2b74a} certstorename=MY &lt;SPAN class="lia-text-color-15"&gt;clientcertnegotiation=Enable&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;BR /&gt;&lt;BR /&gt;SSL Certificate successfully added&lt;/PRE&gt;
&lt;/BLOCKQUOTE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;No reboot is needed after making this change. The same change will need to be made for any binding used where IIS Express is checking for a client certificate.&lt;/P&gt;
&lt;H3&gt;Solution #3 - App Changes&lt;/H3&gt;
&lt;P&gt;I don't cover code changes here, but if you want to remove the client cert check from IIS Express, then you can delete this part of its&amp;nbsp;&lt;EM&gt;applicationhost.config&lt;/EM&gt;:&lt;/P&gt;
&lt;BLOCKQUOTE&gt;
&lt;PRE&gt;&amp;lt;access sslFlags="SslNegotiateCert" /&amp;gt;&lt;/PRE&gt;
&lt;/BLOCKQUOTE&gt;
&lt;P&gt;This "sslFlags" property can hold multiple, comma-separate values. Thus, if other values like "Ssl" are present, you can just delete the "SslNegotiateCert" and the "SslRequireCert" values if either or both are present. If both are present, both must be deleted.&lt;/P&gt;
&lt;P&gt;At that point, you can modify the app, if needed, to not depend on client certificates for local testing. You would want to ensure to do this in a way that won't affect production traffic (i.e. if in production this app receives requests sent to https://localhost, then you shouldn't use localhost as a way to determine if it's IIS Express or not). You can do something like using an environment variable, checking the process name (IIS Express uses "iisexpress.exe", etc. Just be sure to not add this work into a hot code path so in production the code is not executed more than needed. Ideally, this would be a check during application startup so it's only done once.&amp;nbsp;&lt;/P&gt;
&lt;H1&gt;Background/Extra Information&lt;/H1&gt;
&lt;P&gt;Like full IIS, IIS Express does not directly open network sockets and listen for requests from a client at the network level. Both IIS and IIS Express use the Windows &lt;A class="lia-external-url" href="https://learn.microsoft.com/en-us/windows/win32/http/http-server-api-overview" target="_blank" rel="noopener"&gt;HTTP Server APIs&lt;/A&gt; for the actual inbound HTTP legwork. We in Microsoft support typically refer to these APIs and functionality collectively as "http.sys" since that kernel driver is where this is all handled. In other words, when a client sends a request to either IIS or IIS Express, the actual&amp;nbsp;&lt;EM&gt;server&lt;/EM&gt; doing the listening for and acceptance of inbound connections, any TLS stuff, and the initial HTTP request parsing, is handled by http.sys in the kernel. Once all that work is done, a handle to the HTTP request is delivered to IIS/IIS Express (in user mode) for processing. "Processing" here includes the instantiation of IIS-specific data structures, calling various modules to do things, invoking the hosted application to do its own work, etc. Once the processing is complete, IIS/IIS Express calls http.sys back to send the response.&lt;/P&gt;
&lt;P&gt;The important part is that IIS/IIS Express doesn't have much control over the parameters of the network connection or the TLS session if applicable, and &lt;STRONG&gt;IIS/IIS Express only get involved once the actual HTTP request has been received, parsed, validated, and delivered from http.sys&lt;/STRONG&gt;. Thus, when IIS/IIS Express is configured to check for and/or require a client certificate, it can only make this check long after the TLS handshake was completed. Unless the client was asked on the&amp;nbsp;&lt;STRONG&gt;initial TLS handshake&lt;/STRONG&gt; for a certificate, they would not have sent one.&lt;/P&gt;
&lt;P&gt;TLS 1.2 and prior versions allow a process called&amp;nbsp;&lt;STRONG&gt;renegotiation&lt;/STRONG&gt; to take place. This means a second handshake will take place inside the existing encrypted tunnel, and the server can then ask the client for a certificate in that second handshake. Http.sys handles all this work with Schannel in the kernel, and IIS/IIS Express is called back for further processing once it's all done. All that extra work is invisible to the hosted application and is generally seamless.&lt;/P&gt;
&lt;P&gt;TLS 1.3 does not allow renegotiation to take place. It does have the ability to request client authentication &lt;EM&gt;after&lt;/EM&gt; the handshake (called "post-handshake client authentication",&amp;nbsp;&lt;A class="lia-external-url" href="https://www.rfc-editor.org/rfc/rfc8446#section-4.2.6" target="_blank" rel="noopener"&gt;RFC&lt;/A&gt;), but it's 1.3-specific and the majority of clients, browsers included, have not implemented support for this extension at the time of this writing (it's optional per the RFC). Thus, unless a client certificate was negotiated from the very beginning, &lt;EM&gt;during the TLS handshake&lt;/EM&gt;, one cannot be asked for or sent later with most clients. That puts IIS and IIS Express in a tight spot because they reside so late in the process - they have to tell http.sys up-front, before they get involved in the specific request, that they want a client certificate since they can't get one after-the-fact.&amp;nbsp;&lt;/P&gt;
&lt;P&gt;This was fixed in full IIS in Windows Server 2025 by adding a "Negotiate Client Certificate" checkbox to the &lt;EM&gt;https&lt;/EM&gt;-type of site binding. This works because an IIS &lt;EM&gt;https&lt;/EM&gt; site binding is really just a higher-level representation of an http.sys SSL binding (the ones listed in&amp;nbsp;&lt;EM&gt;netsh http show ssl&lt;/EM&gt; that was used earlier in this post in solution #2). I like to think of bindings as specific doors into a web site. Different bindings are different doors that require different parameters for entry. So when you create a site binding, IIS under-the-hood is calling http.sys APIs to create one of its bindings as well. That new "Negotiate Client Certificate" option maps to the "clientcertnegotiation" property which configures http.sys to request a client certificate on the initial TLS handshake, thus allowing full IIS to work with TLS 1.3+client certificates. Before this fix, and currently on Windows Server 2022, options to fix were/are similar to what's in this post for IIS Express. You could manually update the http.sys binding (like solution #2). You could also select the option to "Disable TLS 1.3 over TCP" which would effectively force TLS 1.2. Or even disable TLS 1.3 inbound. So, contrary to what I wrote higher up, there &lt;EM&gt;is&lt;/EM&gt; some level of control that&amp;nbsp;&lt;EM&gt;full&lt;/EM&gt; IIS has over the http.sys bindings, and thus the TLS session, but not much of it is exposed or configurable to server administrators.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;However&lt;/STRONG&gt;, with IIS Express there is even less control; in fact, there's none. The crucial difference is in how and when those http.sys bindings are created. I mentioned above that with full IIS, they are created dynamically by IIS calling into http.sys when site bindings are configured. A binding in http.sys is tied to a specific site binding in IIS. The bindings used by IIS Express are created long in advance, and not by IIS Express itself. IIS Express has no control over those bindings. When IIS Express is not running, those bindings still exist. Those http.sys bindings are not tied to anything running in IIS Express (there is an active relationship when it's actually running to ensure requests get delivered to the IIS Express process, but the binding will remain after the process exits). You could also reconfigure the project to use a different port in Visual Studio, which would change which pre-created http.sys binding IIS Express gets bound to at runtime (if doing this you would also have to apply one of the solutions to the new binding that is being used). I do think fixing this problem will be much more complicated on the IIS Express and Visual Studio product sides since the bindings aren't created at runtime.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Lastly, why are symptoms/errors different depending on the build of Win11 being run? This behavior difference is due to how http.sys reacts to the client certificate request from IIS Express (or full IIS if that's being used). The symptom difference will also be the difference between Windows Server 2022 and 2025 and up, since those are codebases that map to different Win11 builds.&amp;nbsp;&lt;/P&gt;
&lt;P&gt;On Win11 before 24H2 (and Windows Server 2022), http.sys terminates the client's connection when a client cert was asked for, when the client does not support post-handshake client authentication. Thus, when IIS/IIS Express ask for a certificate when one was not negotiated initially, the connection is terminated. I cannot say why that is the behavior that was implemented in http.sys, but that's how it is. When this happens, IIS/IIS Express is informed of the termination so it can tear its objects and such down, but it can't do anything about it.&lt;/P&gt;
&lt;P&gt;On Win11 24H2 and above (and Windows Server 2025), http.sys now returns a "not supported" error to IIS instead of terminating the connection. This allows IIS to continue executing and send its HTTP 500 detailed error page (it can't send an error page to the user if http.sys terminates the underlying connection) with the 0x80070032 error code.&lt;/P&gt;
&lt;P&gt;Unfortunately, neither of the above symptoms is very helpful for diagnosing the actual cause of the problem, which is one of the reasons I wrote this post. I hope it has helped!&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Thanks for reading!&lt;/P&gt;</description>
      <pubDate>Fri, 29 Aug 2025 22:27:47 GMT</pubDate>
      <guid>https://techcommunity.microsoft.com/t5/iis-support-blog/addressing-tls-1-3-compatibility-issues-in-iis-express-on/ba-p/4449362</guid>
      <dc:creator>MattHamrick</dc:creator>
      <dc:date>2025-08-29T22:27:47Z</dc:date>
    </item>
    <item>
      <title>Script Engine Exception. A ScriptEngine threw exception 'C0000005'</title>
      <link>https://techcommunity.microsoft.com/t5/iis-support-blog/script-engine-exception-a-scriptengine-threw-exception-c0000005/ba-p/4424891</link>
      <description>&lt;P&gt;&lt;STRONG&gt;Issue description:&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;You may encounter issues when using the jscript9legacy.dll (JScript 9) JavaScript engine with Classic ASP, resulting in a Script Engine Exception. Specifically, the error message:&lt;/P&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;A ScriptEngine threw exception 'C0000005' in 'IActiveScript::SetScriptState()' from 'CActiveScriptEngine::ReuseEngine()'&lt;/P&gt;
&lt;/BLOCKQUOTE&gt;
&lt;P&gt;indicates an access violation during script state transition. This typically occurs due to compatibility limitations between Classic ASP and the newer jscript9legacy.dll engine. Despite its name, jscript9legacy.dll is not fully compatible with Classic ASP and differs from the older jscript.dll (JScript 5.8), which is more stable in Classic ASP environments&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;You might see following error in the Event log:&lt;/P&gt;
&lt;P&gt;Event Xml:&lt;/P&gt;
&lt;P&gt;&amp;lt;Event xmlns=&lt;A href="https://nam11.safelinks.protection.outlook.com/?url=http%3A%2F%2Fschemas.microsoft.com%2Fwin%2F2004%2F08%2Fevents%2Fevent&amp;amp;data=05%7C02%7Csgreenberg%40bstglobal.com%7C6075be7db1e0484dbb1908dd9ead99b0%7Ca8a719dc348d46efb888fa1832eaac47%7C0%7C0%7C638841190639317532%7CUnknown%7CTWFpbGZsb3d8eyJFbXB0eU1hcGkiOnRydWUsIlYiOiIwLjAuMDAwMCIsIlAiOiJXaW4zMiIsIkFOIjoiTWFpbCIsIldUIjoyfQ%3D%3D%7C0%7C%7C%7C&amp;amp;sdata=pb9t%2FXOOQqWOwBbd8rpVU9kV3Pdi50OIuNWWt%2FP3Er0%3D&amp;amp;reserved=0" target="_blank" rel="noopener" aria-label="Link http://schemas.microsoft.com/win/2004/08/events/event"&gt;http://schemas.microsoft.com/win/2004/08/events/event&lt;/A&gt;&amp;gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;lt;System&amp;gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp; &amp;lt;Provider Name="Active Server Pages" /&amp;gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp; &amp;lt;EventID Qualifiers="49152"&amp;gt;5&amp;lt;/EventID&amp;gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp; &amp;lt;Version&amp;gt;0&amp;lt;/Version&amp;gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp; &amp;lt;Level&amp;gt;2&amp;lt;/Level&amp;gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp; &amp;lt;Task&amp;gt;0&amp;lt;/Task&amp;gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp; &amp;lt;Opcode&amp;gt;0&amp;lt;/Opcode&amp;gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp; &amp;lt;Keywords&amp;gt;0x80000000000000&amp;lt;/Keywords&amp;gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp; &amp;lt;TimeCreated SystemTime="2025-05-28T15:25:47.7068466Z" /&amp;gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp; &amp;lt;EventRecordID&amp;gt;10933&amp;lt;/EventRecordID&amp;gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp; &amp;lt;Correlation /&amp;gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp; &amp;lt;Execution ProcessID="11336" ThreadID="0" /&amp;gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp; &amp;lt;Channel&amp;gt;Application&amp;lt;/Channel&amp;gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp; &amp;lt;Computer&amp;gt;Computer Name&amp;lt;/Computer&amp;gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp; &amp;lt;Security /&amp;gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;lt;/System&amp;gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;lt;EventData&amp;gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp; &amp;lt;Data&amp;gt;File /AuroraWeb/ENT_Automation.asp&amp;nbsp; Script Engine Exception. A ScriptEngine threw exception 'C0000005' in 'IActiveScript::SetScriptState()' from 'CActiveScriptEngine::ReuseEngine()'.&amp;lt;/Data&amp;gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;lt;/EventData&amp;gt;&lt;/P&gt;
&lt;P&gt;&amp;lt;/Event&amp;gt;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;More about the JavaScript libraries for Classic ASP:&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;jscrip9legacy is a newer engine than jscrip9legacy, don’t confuse it with the word ‘legacy’ in jscrip9legacy.&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG&gt;jscript.dll&lt;/STRONG&gt; (Jscript 5.8) = older, compatible with Classic ASP (The &lt;STRONG&gt;real&lt;/STRONG&gt; &lt;STRONG&gt;legacy&lt;/STRONG&gt;&amp;nbsp;dll)&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;jscript9legacy.dll&lt;/STRONG&gt; (Jscript 9) = newer, but less compatible with Classic ASP (The &lt;STRONG&gt;fake legacy&lt;/STRONG&gt;&amp;nbsp;dll&amp;nbsp;😊)&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;The "legacy" label here refers to its role in&amp;nbsp;&lt;STRONG&gt;maintaining compatibility with &lt;/STRONG&gt;&lt;STRONG&gt;legacy websites&lt;/STRONG&gt; (&lt;STRONG&gt;not Classic ASP&lt;/STRONG&gt;) within the Internet Explorer context.&lt;/P&gt;
&lt;P&gt;In details:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG&gt;jscript.dll&lt;/STRONG&gt; refers to the &lt;STRONG&gt;classic JScript engine (version 5.8)&lt;/STRONG&gt;, which is what Classic ASP was originally built to run on. This engine supports legacy constructs and behavior expected by older scripts and COM interactions.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;jscript9.dll / jscript9legacy.dll&lt;/STRONG&gt; is part of the &lt;STRONG&gt;JScript9 engine&lt;/STRONG&gt;, introduced with &lt;STRONG&gt;Internet Explorer 9&lt;/STRONG&gt; to modernize JavaScript support (aligning with ECMAScript 5). It is faster and more standards-compliant….but not backward-compatible with all classic JScript features.&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;&lt;STRONG&gt;Fix:&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;You have 2 ways to fix this issue:&lt;/STRONG&gt;&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;we need to configure the system to use the legacy JScript engine (`jscript.dll`) instead of `jscript9legacy.dll` or&lt;/LI&gt;
&lt;LI&gt;Disable JScriptReplacement in the Registry.&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;&lt;STRONG&gt;Approach 1: use the legacy JScript engine (`jscript.dll`) instead of `jscript9legacy.dll`&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;This involves modifying the Windows Registry to disable the JScript9 engine for the IIS worker process (`w3wp.exe`).&lt;/P&gt;
&lt;P&gt;Here are the steps to follow:&lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;Open the Registry Editor (regedit).&lt;/LI&gt;
&lt;LI&gt;Navigate to the following key:&lt;/LI&gt;
&lt;/OL&gt;
&lt;P&gt;&amp;nbsp;`HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_ENABLE_JSCRIPT9_LEGACY`&lt;/P&gt;
&lt;OL start="3"&gt;
&lt;LI&gt;Create a new DWORD (32-bit) value named `w3wp.exe`.&lt;/LI&gt;
&lt;LI&gt;Set its value to `0`.&lt;/LI&gt;
&lt;LI&gt;For 32-bit systems or applications, also navigate to:&lt;/LI&gt;
&lt;/OL&gt;
&lt;P&gt;&amp;nbsp;`HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_ENABLE_JSCRIPT9_LEGACY`&lt;/P&gt;
&lt;OL start="6"&gt;
&lt;LI&gt;Repeat steps 3 and 4 in this location.&lt;/LI&gt;
&lt;LI&gt;After making these changes, restart IIS to apply the new settings.&lt;/LI&gt;
&lt;/OL&gt;
&lt;P&gt;&lt;STRONG&gt;Approach 2:&amp;nbsp;Disable JScriptReplacement in the Registry&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;This involves modifying the Windows Registry to disable the JScript9 engine for the IIS worker process (`w3wp.exe`).&lt;/P&gt;
&lt;P&gt;Here are the steps to follow:&lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;Open the Registry Editor (regedit).&lt;/LI&gt;
&lt;LI&gt;Navigate to the following key: &amp;nbsp;`&lt;EM&gt;HKEY_LOCAL_MACHINE\Software\Policies\Microsoft\Internet Explorer\Main&lt;/EM&gt;`&lt;/LI&gt;
&lt;LI&gt;Create a new DWORD (32-bit) value named `&lt;EM&gt;JScriptReplacement&lt;/EM&gt;`.&lt;/LI&gt;
&lt;LI&gt;Set its value to `0`.&lt;/LI&gt;
&lt;LI&gt;For 32-bit systems or applications, also navigate to:&lt;/LI&gt;
&lt;/OL&gt;
&lt;P&gt;&amp;nbsp;`&lt;EM&gt;HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Policies\Microsoft\Internet Explorer\Main&lt;/EM&gt;`&lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;Repeat steps 3 and 4 in this location.&lt;/LI&gt;
&lt;LI&gt;After making these changes, restart IIS to apply the new settings.&lt;/LI&gt;
&lt;/OL&gt;
&lt;P&gt;After the above changes, the issue must have been fixed.&lt;/P&gt;
&lt;P&gt;Both FEATURE_ENABLE_JSCRIPT9_LEGACY and JScriptReplacement can be used to control the behavior of the JScript engine on Windows, but they differ in scope, intent, and implementation.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;FEATURE_ENABLE_JSCRIPT9_LEGACY is a feature control setting that applies on a per process basis, allowing you to disable JScript9 for specific executables like w3wp.exe. In contrast, JScriptReplacement is a policy-based setting that disables JScript9 system wide, applying broadly to all processes.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;I hope this helps.&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Wed, 02 Jul 2025 06:31:24 GMT</pubDate>
      <guid>https://techcommunity.microsoft.com/t5/iis-support-blog/script-engine-exception-a-scriptengine-threw-exception-c0000005/ba-p/4424891</guid>
      <dc:creator>Shekhar</dc:creator>
      <dc:date>2025-07-02T06:31:24Z</dc:date>
    </item>
    <item>
      <title>Managing IIS in PowerShell 7: Fixing Get-IISAppPool &amp; Get-IISSite Issues</title>
      <link>https://techcommunity.microsoft.com/t5/iis-support-blog/managing-iis-in-powershell-7-fixing-get-iisapppool-get-iissite/ba-p/4416919</link>
      <description>&lt;P&gt;Managing Internet Information Services (IIS) with PowerShell is a common task for system administrators and developers. Commands like &lt;STRONG&gt;Get-IISAppPool&lt;/STRONG&gt; and &lt;STRONG&gt;Get-IISSite&lt;/STRONG&gt; are essential for retrieving application pools and websites. However, if you're using PowerShell 7 (PowerShell Core), you might run into compatibility issues with the &lt;STRONG&gt;IISAdministration &lt;/STRONG&gt;and &lt;STRONG&gt;WebAdministration&lt;/STRONG&gt; modules, leading to errors like the one shown below:&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;In this article, we’ll explore the root cause of this issue and provide two solutions: one for PowerShell 7 using the &lt;STRONG&gt;Microsoft.Web.Administration&lt;/STRONG&gt; .NET API, and another for Windows PowerShell using the native &lt;STRONG&gt;IISAdministration&lt;/STRONG&gt; module.&lt;/P&gt;
&lt;H3&gt;The Problem: Compatibility Issues in PowerShell 7&lt;/H3&gt;
&lt;P&gt;The screenshot above shows a typical error when running &lt;STRONG&gt;Get-IISAppPool&lt;/STRONG&gt; in PowerShell 7. The command fails with the message: &lt;EM&gt;"Get-IISAppPool: The term 'Get-IISAppPool' is not recognized as a name of a cmdlet, function, script file, or executable program."&lt;/EM&gt; Additionally, importing the &lt;STRONG&gt;WebAdministration&lt;/STRONG&gt; module results in a warning: &lt;EM&gt;"Module WebAdministration is loaded in Windows PowerShell using WinPSCompatSession remoting session; please note that all input and output of commands from this module will be deserialized objects."&lt;/EM&gt;&lt;/P&gt;
&lt;H4&gt;Root Cause&lt;/H4&gt;
&lt;P&gt;The &lt;STRONG&gt;IISAdministration &lt;/STRONG&gt;and &lt;STRONG&gt;WebAdministration &lt;/STRONG&gt;modules were designed for Windows PowerShell (version 5.1) and rely on .NET Framework assemblies like &lt;STRONG&gt;Microsoft.Web.Administration&lt;/STRONG&gt;. PowerShell 7, which uses .NET Core, runs these modules in a compatibility session (&lt;STRONG&gt;WinPSCompatSession&lt;/STRONG&gt;), leading to deserialized objects, performance issues, and sometimes outright failures. This is why &lt;STRONG&gt;Get-IISAppPool&lt;/STRONG&gt; and &lt;STRONG&gt;Get-IISSite&lt;/STRONG&gt; don’t work natively in PowerShell 7.&lt;/P&gt;
&lt;H3&gt;Solution 1: PowerShell 7-Compatible Approach Using Microsoft.Web.Administration&lt;/H3&gt;
&lt;P&gt;To manage IIS in PowerShell 7 without compatibility issues, you can directly use the &lt;STRONG&gt;Microsoft.Web.Administration&lt;/STRONG&gt; .NET API. This approach bypasses the need for the &lt;STRONG&gt;IISAdministration&lt;/STRONG&gt; module and works seamlessly in PowerShell 7.&lt;/P&gt;
&lt;H5&gt;Prerequisites&lt;/H5&gt;
&lt;P&gt;Ensure IIS is installed on the system, as the scripts rely on the &lt;STRONG&gt;Microsoft.Web.Administration.dll&lt;/STRONG&gt; file, typically located at &lt;STRONG&gt;C:\Windows\System32\inetsrv\&lt;/STRONG&gt;.&lt;/P&gt;
&lt;H4&gt;Script to List Application Pools (&lt;STRONG&gt;Equivalent to Get-IISAppPool&lt;/STRONG&gt;)&lt;/H4&gt;
&lt;P&gt;&lt;EM&gt;try {&lt;/EM&gt;&lt;BR /&gt;&lt;EM&gt;&amp;nbsp; &amp;nbsp; # Load the Microsoft.Web.Administration assembly&lt;/EM&gt;&lt;BR /&gt;&lt;EM&gt;&amp;nbsp; &amp;nbsp; Add-Type -Path "C:\Windows\System32\inetsrv\Microsoft.Web.Administration.dll" -ErrorAction Stop&lt;/EM&gt;&lt;/P&gt;
&lt;P&gt;&lt;EM&gt;&amp;nbsp; &amp;nbsp; # Create a ServerManager instance&lt;/EM&gt;&lt;BR /&gt;&lt;EM&gt;&amp;nbsp; &amp;nbsp; $serverManager = New-Object Microsoft.Web.Administration.ServerManager&lt;/EM&gt;&lt;/P&gt;
&lt;P&gt;&lt;EM&gt;&amp;nbsp; &amp;nbsp; # Get all application pools&lt;/EM&gt;&lt;BR /&gt;&lt;EM&gt;&amp;nbsp; &amp;nbsp; $appPools = &lt;STRONG&gt;$serverManager.ApplicationPools&lt;/STRONG&gt;&lt;/EM&gt;&lt;/P&gt;
&lt;P&gt;&lt;EM&gt;&amp;nbsp; &amp;nbsp; # Display application pool names and states&lt;/EM&gt;&lt;BR /&gt;&lt;EM&gt;&amp;nbsp; &amp;nbsp; if ($appPools) {&lt;/EM&gt;&lt;BR /&gt;&lt;EM&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Write-Output "Application Pools found:"&lt;/EM&gt;&lt;BR /&gt;&lt;EM&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; foreach ($appPool in $appPools) {&lt;/EM&gt;&lt;BR /&gt;&lt;EM&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Write-Output "Application Pool: $($appPool.Name), State: $($appPool.State)"&lt;/EM&gt;&lt;BR /&gt;&lt;EM&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/EM&gt;&lt;BR /&gt;&lt;EM&gt;&amp;nbsp; &amp;nbsp; } else {&lt;/EM&gt;&lt;BR /&gt;&lt;EM&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Write-Output "No application pools found."&lt;/EM&gt;&lt;BR /&gt;&lt;EM&gt;&amp;nbsp; &amp;nbsp; }&lt;/EM&gt;&lt;BR /&gt;&lt;EM&gt;}&lt;/EM&gt;&lt;BR /&gt;&lt;EM&gt;catch {&lt;/EM&gt;&lt;BR /&gt;&lt;EM&gt;&amp;nbsp; &amp;nbsp; Write-Error "Failed to list application pools: $_"&lt;/EM&gt;&lt;BR /&gt;&lt;EM&gt;}&lt;/EM&gt;&lt;/P&gt;
&lt;H4&gt;Script to List Websites (&lt;STRONG&gt;Equivalent to Get-IISSite&lt;/STRONG&gt;)&lt;/H4&gt;
&lt;P&gt;&lt;EM&gt;try {&lt;/EM&gt;&lt;BR /&gt;&lt;EM&gt;&amp;nbsp; &amp;nbsp; # Load the Microsoft.Web.Administration assembly&lt;/EM&gt;&lt;BR /&gt;&lt;EM&gt;&amp;nbsp; &amp;nbsp; Add-Type -Path "C:\Windows\System32\inetsrv\Microsoft.Web.Administration.dll" -ErrorAction Stop&lt;/EM&gt;&lt;/P&gt;
&lt;P&gt;&lt;EM&gt;&amp;nbsp; &amp;nbsp; # Create a ServerManager instance&lt;/EM&gt;&lt;BR /&gt;&lt;EM&gt;&amp;nbsp; &amp;nbsp; $serverManager = New-Object Microsoft.Web.Administration.ServerManager&lt;/EM&gt;&lt;/P&gt;
&lt;P&gt;&lt;EM&gt;&amp;nbsp; &amp;nbsp; # Get all websites&lt;/EM&gt;&lt;BR /&gt;&lt;EM&gt;&amp;nbsp; &amp;nbsp; $sites = &lt;STRONG&gt;$serverManager.Sites&lt;/STRONG&gt;&lt;/EM&gt;&lt;/P&gt;
&lt;P&gt;&lt;EM&gt;&amp;nbsp; &amp;nbsp; # Display website names and states&lt;/EM&gt;&lt;BR /&gt;&lt;EM&gt;&amp;nbsp; &amp;nbsp; if ($sites) {&lt;/EM&gt;&lt;BR /&gt;&lt;EM&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Write-Output "Websites found:"&lt;/EM&gt;&lt;BR /&gt;&lt;EM&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; foreach ($site in $sites) {&lt;/EM&gt;&lt;BR /&gt;&lt;EM&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Write-Output "Website: $($site.Name), State: $($site.State)"&lt;/EM&gt;&lt;BR /&gt;&lt;EM&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/EM&gt;&lt;BR /&gt;&lt;EM&gt;&amp;nbsp; &amp;nbsp; } else {&lt;/EM&gt;&lt;BR /&gt;&lt;EM&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Write-Output "No websites found."&lt;/EM&gt;&lt;BR /&gt;&lt;EM&gt;&amp;nbsp; &amp;nbsp; }&lt;/EM&gt;&lt;BR /&gt;&lt;EM&gt;}&lt;/EM&gt;&lt;BR /&gt;&lt;EM&gt;catch {&lt;/EM&gt;&lt;BR /&gt;&lt;EM&gt;&amp;nbsp; &amp;nbsp; Write-Error "Failed to list websites: $_"&lt;/EM&gt;&lt;BR /&gt;&lt;EM&gt;}&lt;/EM&gt;&lt;/P&gt;
&lt;H3&gt;Solution 2: Using Windows PowerShell with IISAdministration Module&lt;/H3&gt;
&lt;P&gt;If you prefer to use the native IISAdministration module, you’ll need to switch to Windows PowerShell (version 5.1), which is fully compatible with the module.&lt;/P&gt;
&lt;H4&gt;Steps&lt;/H4&gt;
&lt;OL&gt;
&lt;LI&gt;&lt;STRONG&gt;Open Windows PowerShell as Administrator&lt;/STRONG&gt;:
&lt;UL&gt;
&lt;LI&gt;From Command Prompt, run:&lt;BR /&gt;&lt;EM&gt;%SystemRoot%\system32\WindowsPowerShell\v1.0\powershell.exe&lt;/EM&gt;&lt;/LI&gt;
&lt;LI&gt;Verify the version:&lt;BR /&gt;&lt;EM&gt;$PSVersionTable.PSVersion&lt;/EM&gt;&lt;BR /&gt;You should see a Major version of 5.1.&lt;/LI&gt;
&lt;/UL&gt;
&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Ensure Required IIS Features Are Installed&lt;/STRONG&gt;:
&lt;UL&gt;
&lt;LI&gt;Run the following to enable necessary IIS management tools:&lt;BR /&gt;&lt;EM&gt;Dism /Online /Enable-Feature /FeatureName:IIS-WebServerManagementTools /All /NoRestart&lt;/EM&gt; &lt;BR /&gt;&lt;EM&gt;Dism /Online /Enable-Feature /FeatureName:IIS-ManagementScriptingTools /All /NoRestart&lt;/EM&gt;&lt;/LI&gt;
&lt;LI&gt;Check for a pending reboot:&lt;BR /&gt;&lt;EM&gt;if (Test-Path "HKLM:\Software\Microsoft\Windows\CurrentVersion\Component Based Servicing\RebootPending") { Write-Warning "A reboot is required. Please restart the server." }&lt;/EM&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Install and Import the IISAdministration Module&lt;/STRONG&gt;:&lt;BR /&gt;&lt;EM&gt;Install-Module -Name IISAdministration -Force &lt;/EM&gt;&lt;BR /&gt;&lt;EM&gt;Import-Module IISAdministration -Force&lt;/EM&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Run the Commands&lt;/STRONG&gt;:
&lt;UL&gt;
&lt;LI&gt;List application pools:&lt;BR /&gt;&lt;EM&gt;Get-IISAppPool&lt;/EM&gt;&lt;/LI&gt;
&lt;LI&gt;List websites:&lt;BR /&gt;&lt;EM&gt;Get-IISSite&lt;/EM&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;/LI&gt;
&lt;/OL&gt;
&lt;H3&gt;Best Practices for Production Environments&lt;/H3&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG&gt;Test First&lt;/STRONG&gt;: Always test scripts in a staging environment before running them in production, as enabling IIS features may require a server reboot.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Backup IIS Configuration&lt;/STRONG&gt;:&lt;BR /&gt;"C:\Windows\System32\inetsrv\appcmd.exe" add backup "PreScriptBackup"&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Run as Administrator&lt;/STRONG&gt;: Ensure PowerShell is running with elevated privileges, as IIS management tasks require administrative access.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Schedule Maintenance&lt;/STRONG&gt;: If a reboot is needed, schedule a maintenance window to avoid downtime.&lt;/LI&gt;
&lt;/UL&gt;
&lt;H3&gt;Conclusion&lt;/H3&gt;
&lt;P&gt;Managing IIS in PowerShell 7 requires a different approach due to compatibility issues with the IISAdministration and WebAdministration modules. By using the Microsoft.Web.Administration .NET API, you can achieve the same functionality as Get-IISAppPool and Get-IISSite in a PowerShell 7-compatible way. For those who prefer the native modules, switching to Windows PowerShell provides a seamless experience.&lt;/P&gt;</description>
      <pubDate>Fri, 23 May 2025 16:42:08 GMT</pubDate>
      <guid>https://techcommunity.microsoft.com/t5/iis-support-blog/managing-iis-in-powershell-7-fixing-get-iisapppool-get-iissite/ba-p/4416919</guid>
      <dc:creator>DeepakParashar</dc:creator>
      <dc:date>2025-05-23T16:42:08Z</dc:date>
    </item>
  </channel>
</rss>

