Skip to content

Configuring Scalar Authentication with Microsoft Entra ID

Learn how to configure Scalar API documentation to authenticate with Microsoft Entra ID (formerly Azure AD) for testing protected endpoints in ASP.NET Core applications.

Problem Statement

When using Scalar as an alternative to Swagger/SwaggerUI for API documentation, you may encounter authentication issues when testing endpoints that require Microsoft Entra ID authentication. While your frontend application successfully authenticates users and obtains bearer tokens, Scalar doesn't automatically handle this authentication flow, resulting in 401 Unauthorized responses when testing protected APIs.

This guide explains how to configure Scalar to integrate with Microsoft Entra ID's OAuth 2.0 authorization code flow with PKCE, enabling you to test authenticated endpoints directly from your API documentation.

Environment Requirements

  • ASP.NET Core 9 Web API
  • Microsoft OpenAPI package
  • Scalar's ASP.NET integration package
  • Microsoft Entra ID app registrations

Configuration Steps

1. OpenAPI Security Scheme Configuration

Configure the OpenAPI security scheme in your Program.cs to define the OAuth 2.0 flow for Microsoft Entra ID:

csharp
builder.Services.AddOpenApi(options =>
{
    options.AddDocumentTransformer((document, context, cancellationToken) =>
    {
        document.Components ??= new OpenApiComponents();

        document.Components.SecuritySchemes.Add(JwtBearerDefaults.AuthenticationScheme, new OpenApiSecurityScheme
        {
            Type = SecuritySchemeType.OAuth2,
            Flows = new OpenApiOAuthFlows
            {
                AuthorizationCode = new OpenApiOAuthFlow
                {
                    AuthorizationUrl = new Uri($"https://login.microsoftonline.com/{builder.Configuration["AzureAD:TenantId"]}/oauth2/v2.0/authorize"),
                    TokenUrl = new Uri($"https://login.microsoftonline.com/{builder.Configuration["AzureAD:TenantId"]}/oauth2/v2.0/token"),
                    Scopes = new Dictionary<string, string>
                    {
                        {builder.Configuration["AzureAd:Scopes"], "Data Access"}
                    },
                    // To allow Scalar to select PKCE by Default
                    // valid options are 'SHA-256' | 'plain' | 'no'
                    Extensions = new Dictionary<string, IOpenApiExtension>()
                    {
                        ["x-usePkce"] = new OpenApiString("SHA-256")
                    }
                }
            }
        });

        // Provide a security requirement for all operations
        document.SecurityRequirements.Add(new OpenApiSecurityRequirement
        {
            {
                new OpenApiSecurityScheme
                {
                    Reference = new OpenApiReference
                    {
                        Type = ReferenceType.SecurityScheme,
                        Id = JwtBearerDefaults.AuthenticationScheme
                    }
                },
                // scopes
                [builder.Configuration["AzureAd:Scopes"]]
            }
        });

        return Task.CompletedTask;
    });
});

2. Scalar Configuration

Configure Scalar with authentication options in your Program.cs:

csharp
app.MapScalarApiReference(options =>
{
    options.Authentication = new ScalarAuthenticationOptions
    {
        PreferredSecurityScheme = JwtBearerDefaults.AuthenticationScheme,
        OAuth2 = new OAuth2Options
        {
            ClientId = builder.Configuration["AzureAd:ClientId"],
            Scopes = [builder.Configuration["AzureAd:Scopes"]]
        }
    };
});

3. Microsoft Entra ID App Registration Configuration

IMPORTANT

You must configure your Entra ID app registration with the proper redirect URIs and scopes for Scalar to work correctly.

Frontend App Registration:

  1. Add a redirect URI for Scalar (typically https://localhost:<port>/scalar/v1)
  2. Ensure the client ID matches what you configured in your Scalar options

Backend App Registration:

  1. Expose an API with the appropriate scopes
  2. The scope format should be: api://<client-id>/<scope-name>

Authentication Endpoints:

Use tenant-specific endpoints instead of the common endpoints:

  • Authorization: https://login.microsoftonline.com/{tenant-id}/oauth2/v2.0/authorize
  • Token: https://login.microsoftonline.com/{tenant-id}/oauth2/v2.0/token

Configuration Values

Store these values in your configuration (e.g., appsettings.json or user secrets):

json
{
  "AzureAd": {
    "TenantId": "your-tenant-id",
    "ClientId": "your-client-id",
    "Scopes": "api://your-client-id/data.read"
  }
}

Common Issues and Solutions

Redirect URI Mismatch

DANGER

Ensure the redirect URI in your Entra ID app registration matches exactly with what Scalar uses (typically https://localhost:<port>/scalar/v1).

Endpoint Configuration

Use tenant-specific endpoints instead of the common endpoints:

  • https://login.microsoftonline.com/common/oauth2/v2.0/authorize
  • https://login.microsoftonline.com/{tenant-id}/oauth2/v2.0/authorize

Scope Configuration

Ensure your scopes follow the correct format and are properly exposed in your backend app registration:

csharp
// Incorrect scope format (may not work)
Scopes = ["User.Read"]

// Correct scope format
Scopes = ["api://your-client-id/data.read"]

PKCE Configuration

Scalar supports PKCE (Proof Key for Code Exchange) for enhanced security. The configuration includes:

csharp
Extensions = new Dictionary<string, IOpenApiExtension>()
{
    ["x-usePkce"] = new OpenApiString("SHA-256")
}

Testing the Configuration

Once configured:

  1. Start your application
  2. Navigate to the Scalar endpoint (typically /scalar)
  3. You should see an Authentication section at the top
  4. Select the OAuth 2.0 authentication type
  5. Click "Authorize" to initiate the Entra ID authentication flow
  6. After successful authentication, you can test protected endpoints

Advanced Configuration

Multiple Security Schemes

If your API supports multiple authentication methods, you can configure multiple security schemes:

csharp
document.Components.SecuritySchemes.Add("oauth2", new OpenApiSecurityScheme
{
    Type = SecuritySchemeType.OAuth2,
    // OAuth2 configuration
});

document.Components.SecuritySchemes.Add("bearer", new OpenApiSecurityScheme
{
    Type = SecuritySchemeType.Http,
    Scheme = "bearer",
    BearerFormat = "JWT"
});

Custom Scopes

For APIs with multiple permission levels, define multiple scopes:

csharp
Scopes = new Dictionary<string, string>
{
    {"api://client-id/data.read", "Read data"},
    {"api://client-id/data.write", "Write data"},
    {"api://client-id/data.admin", "Admin access"}
}

Troubleshooting

Common Error: IDX10511

If you encounter IDX10511: Signature validation failed errors:

  1. Ensure your token validation parameters are correctly configured
  2. Verify the issuer and audience claims match your app registration settings
  3. Check that the signing keys are being properly resolved

Authentication Not Preselected

If the authentication type isn't preselected in Scalar:

  1. Verify that PreferredSecurityScheme matches the security scheme name in your OpenAPI configuration
  2. Ensure the security requirement is properly added to the document

Conclusion

Configuring Scalar to authenticate with Microsoft Entra ID enables seamless testing of protected APIs directly from your documentation. By properly setting up the OAuth 2.0 authorization code flow with PKCE, configuring the correct endpoints and scopes, and ensuring proper app registration settings, you can create a secure and user-friendly testing environment for your authenticated APIs.

For the most up-to-date information, always refer to the official Scalar documentation and Microsoft Entra ID documentation.