802.1X or VPN authentication fails at NPS — reason codes 16, 23, 48 and 265
NPS logs a numeric reason for every rejection, and that number is the diagnosis.
What you see
Wi-Fi or VPN authentication fails for some or all users. The client gives a generic message; the server has the detail.
What is actually wrong
Reason 265 is a certificate chain problem, 48 means no policy matched, 16 is bad credentials, and 23 is an authentication protocol mismatch.
Codes and articles
Fixes (3)
Fix the certificate chain
Reason code 265.
Read the rejection, which names the certificate problem.
Get-WinEvent -LogName Security -MaxEvents 100 | Where-Object Id -eq 6273 | Select-Object -First 3 | Format-List MessageCheck the server certificate NPS is using — it needs a Server Authentication EKU and the private key.
Get-ChildItem Cert:\LocalMachine\My | Where-Object { $_.EnhancedKeyUsageList.FriendlyName -contains 'Server Authentication' } | Format-List Subject,NotAfter,Thumbprint,HasPrivateKeyThe most common cause is an expired certificate that was renewed but not selected in the network policy. Renewing does not update the policy.
The policy stores the certificate by identity. A renewed certificate is a new object, so the policy still points at the old one and every authentication fails on the day it expires.
Open the network policy, edit the PEAP or EAP-TLS configuration, and select the current certificate. Do this on every NPS server.
Confirm the clients trust the issuing CA — if they do not, they reject the server and it presents at the server as this code.
Get-ChildItem Cert:\LocalMachine\Root | Where-Object Subject -like '*YourCA*' | Format-List Subject,NotAfterCheck the CRL is reachable from the clients, since a revocation check that cannot complete fails closed by default.
certutil -URL (Get-ChildItem Cert:\LocalMachine\My | Select-Object -First 1).Thumbprint
Get-WinEvent -LogName Security -MaxEvents 50 | Where-Object Id -eq 6272 | Select-Object -First 3 TimeCreatedGet a policy to match
Reason code 48.
Read the event — it lists the conditions that were evaluated.
Get-WinEvent -LogName Security -MaxEvents 50 | Where-Object Id -eq 6273 | Select-Object -First 2 | Format-List MessageList the policies and their order. They are evaluated top to bottom and the first match wins.
Get-NpsNetworkPolicy | Format-Table PolicyName,Enabled,ProcessingOrder,PolicySource -AutoSizeA disabled policy or one below a broader deny rule is the usual cause. The order matters as much as the contents, and the console makes it easy to add a correct policy in the wrong position.
Check the connection request policy too — that is evaluated first and can reject before the network policy is reached.
Get-NpsRadiusClient | Format-Table Name,Address,EnabledCheck the RADIUS client is registered with the right shared secret — an unregistered access point is silently ignored.
Verify the user or computer is in the group the policy requires.
Get-ADUser jbloggs -Properties MemberOf | Select-Object -ExpandProperty MemberOfEnable NPS accounting to a text file so failures are easier to read than in the Security log.
Get-NpsRadiusClient | Format-List
Resolve the authentication method or credential
Reason 16 or 23.
Reason 16 is a bad credential. Check the account is not locked or expired before assuming a policy fault.
Get-ADUser jbloggs -Properties LockedOut,PasswordExpired,Enabled,msNPAllowDialin | Format-ListmsNPAllowDialin set to False overrides everything else and is easy to miss.
Get-ADUser -Filter { msNPAllowDialin -eq $false } | Format-Table Name,SamAccountNameThe dial-in property on the user object takes precedence over the network policy. A single user failing while everyone else works is nearly always this.
Reason 23 is a protocol mismatch. Compare what the policy permits against what the client offers.
Get-NpsNetworkPolicy | Format-List PolicyName,ProcessingOrderMS-CHAPv2 requires the account's password to be stored in a reversibly-compatible form for some methods — check the policy is not requiring something the directory cannot supply.
For a machine-authenticating 802.1X deployment, confirm the computer account is being used rather than the user, and that the client is configured for computer authentication.
Where this stops. This write-up was written and checked by hand. It says what each step changes, how to confirm it worked and how to reverse it, and anything destructive is flagged before you reach it. If it does not match what your machine is doing, search the Support Centre for the exact code or message — and when something needs a person, get in touch.