oshco / adfs
Library to provide ADFS integration for WebFiori based applications.
v1.3.0
2026-04-12 20:21 UTC
Requires
- webfiori/file: 2.0.*
- webfiori/http: 5.0.*
- webfiori/jsonx: 4.0.*
- webfiori/ui: 4.0.*
Requires (Dev)
- phpunit/phpunit: ^11.5
README
A PHP library that provides ADFS (Active Directory Federation Services) single sign-on integration for WebFiori based applications using SAML 2.0.
Requirements
- PHP 8.1 or later
- WebFiori HTTP 5.0+
- WebFiori UI 4.0+
- WebFiori File 2.0+
- WebFiori JsonX 4.0+
Installation
composer require oshco/adfs
How It Works
- Your application builds a SAML request using
SAMLRequestand redirects the user to the ADFS server. - The user authenticates on the ADFS login page.
- ADFS posts a SAML response back to your application's callback endpoint.
- Your
ADFSVerificationServicesubclass parses the response, looks up the user, and handles success or failure.
Classes and Interfaces
| Class / Interface | Description |
|---|---|
ADFSUser |
Interface representing an authenticated user. Requires getId(). |
SAMLRequest |
Builds a SAML 2.0 authentication request. Supports XML generation and base64+deflate encoding for HTTP-Redirect binding. |
ADFSResponse |
Parses a base64-encoded SAML response from ADFS. Extracts success/failure status, username, and application name. |
ADFSVerificationService |
Abstract web service that acts as the ADFS callback endpoint. Subclass it to implement getUser() and onSuccess(). |
Usage
1. Implement the ADFSUser interface
use oshco\adfs\ADFSUser; class AppUser implements ADFSUser { private int $id; private string $email; public function __construct(int $id, string $email) { $this->id = $id; $this->email = $email; } public function getId() { return $this->id; } }
2. Build and send a SAML request
use oshco\adfs\SAMLRequest; $request = new SAMLRequest(); $request->setDestination('https://adfs.example.com/adfs/ls'); $request->setAppID('My Application'); $request->setAppURL('https://myapp.example.com'); $request->setIssueInstant(gmdate('Y-m-d\TH:i:s\Z')); $encoded = $request->encode(); // Redirect user to ADFS with the encoded SAML request header('Location: https://adfs.example.com/adfs/ls?SAMLRequest=' . urlencode($encoded));
3. Create a verification service
Extend ADFSVerificationService and implement the two abstract methods:
use oshco\adfs\ADFSUser; use oshco\adfs\ADFSVerificationService; class MyVerificationService extends ADFSVerificationService { public function __construct() { parent::__construct('adfs-verify', 'https://myapp.example.com/login-failed'); } public function getUser(string $username): ?ADFSUser { // Look up the user in your database by username/email // Return an ADFSUser instance or null if not found } public function onSuccess(ADFSUser $user) { // User authenticated successfully // Set session, redirect to dashboard, etc. } }
When ADFS posts back to your endpoint, the service will:
- Parse the SAML response
- Call
getUser()with the authenticated username - Call
onSuccess()if the user is found, oronFail()if not (redirects to the fail URL with a?status=parameter)
4. Inspect the SAML response
use oshco\adfs\ADFSResponse; $response = new ADFSResponse($_POST['SAMLResponse']); $response->isSuccess(); // true if ADFS authentication succeeded $response->getUserName(); // authenticated username (lowercased) $response->getAppName(); // application name from ADFS $response->getXMLString(); // raw XML of the SAML response $response->storeResponse(); // save response to file for debugging
Running Tests
composer test
License
This library is licensed under the MIT License.
Copyright (c) 2023 Olayan Saudi Holding Company (OSHCO)