Skip to main content

IIS Windows Authentication Token handling for Django

Project description

Windows Authentication Token handling for Django

PyPI - Version GitHub branch check runs

When IIS on Windows is used as a webserver frontend for Django, authentication can be handled by the webserver using Windows Authentication. Microsoft recommends using the HttpPlatformHandler method to integrate Python webapps with IIS. Unlike the FastCGI handler which requires the old and unmaintained wfastcgi Python dependency, the HttpPlatformHandler doesn't set the REMOTE_USER variable after authentication. Instead, the authenticated user receives a Windows Authentication Token, which is available as a header named X-IIS-WindowsAuthToken.

This package provides a Django middleware that extracts this token from the request, retrieves the actual username from Windows, and sets the REMOTE_USER variable accordingly. This allows you to use Django's built-in authentication mechanisms seamlessly.

Installation

You can install the package using pip:

pip install django-windowsauthtoken

On Windows, this will also install the pywin32 package, which is required to interact with Windows APIs. Note that pywin32 is only available on Windows, so this package will not work on other operating systems.

After installation, add the middleware to your Django settings:

MIDDLEWARE = [
    ...,
    "django.auth.middleware.AuthenticationMiddleware",
    # Ensure this comes before RemoteUserMiddleware
    "django_windowsauthtoken.middleware.WindowsAuthTokenMiddleware",
    # You'll likely want to use Django's RemoteUserMiddleware too, to process the REMOTE_USER variable
    "django.contrib.auth.middleware.RemoteUserMiddleware",
    ...
]

If you're using Django's RemoteUserMiddleware, you might also want to set:

AUTHENTICATION_BACKENDS = [
    "django.contrib.auth.backends.RemoteUserBackend",
    ...
]

Now configure IIS to integrate with your Django application using the HttpPlatformHandler, and ensure that Windows Authentication is enabled for your site.

TODO: Add detailed instructions for setting up IIS.

Usage

Once the middleware is added, it will automatically handle the extraction of the Windows Authentication token from the X-IIS-WindowsAuthToken header and set the REMOTE_USER variable. You can then use Django's authentication system as usual.

The RemoteUserMiddleware will use the REMOTE_USER variable to authenticate users against Django's user model. If a user with the given username does not exist, it will by default create a new user. See the Django documentation for more details on how RemoteUserMiddleware works.

Username format

By default, the middleware will set the REMOTE_USER variable to the username in the format DOMAIN\username. While this is true to the Windows Authentication standard, it may not be the format you want to use in your Django application, especially if you are using Django's default user model which does not allow backslashes in usernames.

If you prefer to use just the username without the domain, you can configure this by setting the following in your Django settings:

WINDOWSAUTHTOKEN_USERNAME_FORMATTER = "django_windowsauthtoken.formatters.format_username_only"

Alternatively, if you want to use the username@domain format, you can set:

WINDOWSAUTHTOKEN_USERNAME_FORMATTER = "django_windowsauthtoken.formatters.format_email_like"

Both of the above formats are acceptable by Django. You can also implement your own custom formatter function. The function should take two arguments: username and domain, and return the formatted username.

Debugging

When setting up IIS or the middleware is not working as expected, there is a debug view that shows all relevant information from the request. To enable it, add the following to your urls.py:

from django.urls import path
from django_windowsauthtoken.views import debug_view

urlpatterns = [
    ...,
    path("windowsauthtoken-debug/", debug_view, name="windowsauthtoken-debug"),
    ...,
]

You will also need to enable DEBUG in your Django settings. Then navigate to /windowsauthtoken-debug/ in your browser. This view will display the headers and other relevant information from the request, which can help you diagnose issues with the middleware or IIS configuration.

Development

To contribute to the development of this package, clone the repository and install the development dependencies:

git clone https://github.com/whyscream/django-windowsauthtoken
cd django-windowsauthtoken
uv sync --dev

Note on pywin32

When developing on a non-Windows system, you can work around the absence of pywin32 by setting the following environment variable:

WINDOWSAUTHTOKEN_IGNORE_PYWIN32_ERRORS=true

This will allow you to run the tests and work on the code without pywin32, but note that the middleware will not function correctly without it.

Running Tests

You can run the tests using pytest:

pytest

When making changes, ensure that you add tests for any new functionality and run the existing tests to verify that everything works as expected.

Coding standards

Code formatting and linting is done using ruff and pre-commit. See the pre-commit docs on how to set it up. You can check the formatting manually by running:

pre-commit run --all-files

License

This project is licensed under the BSD-3-Clause License. See the LICENSE file for details.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

django_windowsauthtoken-0.1.0.tar.gz (73.1 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

django_windowsauthtoken-0.1.0-py3-none-any.whl (8.1 kB view details)

Uploaded Python 3

File details

Details for the file django_windowsauthtoken-0.1.0.tar.gz.

File metadata

  • Download URL: django_windowsauthtoken-0.1.0.tar.gz
  • Upload date:
  • Size: 73.1 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.12.9

File hashes

Hashes for django_windowsauthtoken-0.1.0.tar.gz
Algorithm Hash digest
SHA256 5ddeec764903aed5256b74ffbeeb62cd3913705177f289b849255868ae9b46e6
MD5 9aa3035ae44c791b9e93bf26789fa802
BLAKE2b-256 e25b99aaf0176f4defc11692311892d6f9312fb89e875f2e2845c4dd7c8cc58c

See more details on using hashes here.

Provenance

The following attestation bundles were made for django_windowsauthtoken-0.1.0.tar.gz:

Publisher: python-publish.yml on whyscream/django-windowsauthtoken

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file django_windowsauthtoken-0.1.0-py3-none-any.whl.

File metadata

File hashes

Hashes for django_windowsauthtoken-0.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 282537b6f09e1b1bfb2599a669693fcc0d9c40f56c7d2fcbde03146f47910da9
MD5 6f77362c9faa6e419c2e376c2dd39a1c
BLAKE2b-256 9275226eb56f2cca60c678a1f16ff5822c8515e7d030d9abddf2a7a491fd8dd7

See more details on using hashes here.

Provenance

The following attestation bundles were made for django_windowsauthtoken-0.1.0-py3-none-any.whl:

Publisher: python-publish.yml on whyscream/django-windowsauthtoken

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page