Automation Glossary • Fix OPC UA Reads Failing After Browse

How to Fix OPC UA Reads That Fail After Browse Succeeds

Merobix Engineering • • 6 min read

You connected, you browsed the address space, every node is right there - and then a read of the same node returns BadUserAccessDenied or BadNotReadable. This is a confusing failure because the connection is clearly healthy; browse would not work otherwise. The problem is almost always authorization or the node's own attributes, not the network. This page orders the causes so you stop re-checking cables and fix the actual access rule.

Back to Blog

Fix OPC UA Reads Failing After Browse in one line: When an OPC UA browse succeeds but reads fail, the session is connected and the fault is authorization or node attributes. Check, in order: the user identity your session authenticated with and its server-side role, the node's AccessLevel and UserAccessLevel attributes, and whether the value is write-only or requires an elevated role. Browse rights and read rights are granted separately.

Confirm the Session Identity You Actually Authenticated As

Browse often succeeds for anonymous or low-privilege sessions while reads of process values require an authenticated user, so the first check is which identity your session is really using. Anonymous access is a common default that a hardened server leaves able to browse the structure but not read live values. Look at the session's user token: are you connecting anonymously when the server expects a username and password?

If you are supplying credentials, confirm the server accepted them and mapped them to a role that has read permission. A server can authenticate a user and still deny the read because that user's role is scoped to browse only. This is separate from certificate trust, which if broken would stop the connection entirely - if you never got a session at all, start with OPC UA certificate trust errors instead.

Read the Node's AccessLevel and UserAccessLevel Attributes

Every variable node carries two attributes that decide readability: AccessLevel, which is what the node permits in principle, and UserAccessLevel, which is what the current session is allowed given its identity. Browse the node, then read those two attributes specifically rather than the Value. If AccessLevel does not include CurrentRead, the node is not readable by anyone and you are chasing the wrong thing.

If AccessLevel includes read but UserAccessLevel does not, the node is readable in general but not by your session - a clear authorization result. That difference is the single most useful diagnostic here: it tells you instantly whether to fix the node configuration or your user role. Understanding how the node is addressed also helps; see the OPC UA NodeId.

Check for Write-Only and Method-Only Nodes

Some nodes are legitimately not readable. A command or setpoint node may expose CurrentWrite without CurrentRead by design, so a read returns BadNotReadable no matter who you are. Confirm from the AccessLevel attribute whether read is even offered before assuming a permission bug. If it is a Method rather than a Variable, you call it, you do not read it.

Historical nodes add a wrinkle: HistoryRead is a separate permission from the current-value read. A node may let you read the live value but deny a history read, or the reverse, so match the service you are calling to the access bit that governs it. Do not conclude the whole node is broken because one flavor of read was denied.

Rule Out Server-Side Role and Namespace Restrictions

Modern OPC UA servers implement role-based permissions that can restrict reads by namespace, by node, or by user group. A common pattern grants everyone browse of the type system and public namespace while restricting the live process namespace to named operator roles. If your reads fail only inside one namespace, that is the signature of a namespace-scoped rule, not a global one.

Check the server's role configuration or ask whoever administers it which role your user maps to and what that role can read. On a remote gateway you may not administer the server directly, so document the exact NodeId, the identity you used, and the status code returned, then hand that to the server owner. The security policy in force can also gate access - review the OPC UA security policy Basic256Sha256 to confirm you are on a policy the server ties permissions to.

Verify the Fix

After adjusting the identity or role, reconnect a fresh session - permission changes usually take effect on the next session, not the current one - and read the previously failing node. A clean read with good quality confirms the authorization path. Re-read UserAccessLevel too; it should now include CurrentRead for your session, which proves the server, not luck, granted the right.

If the read now works for one node but not its neighbor, you have a per-node or per-namespace rule rather than a blanket one, and you repeat the check on the failing node's AccessLevel. Keep the successful case as your reference so the next failure is a comparison, not a fresh investigation.

Common Mistakes

The biggest mistake is treating a read failure as a connectivity problem and cycling the link, the certificate, and the endpoint while the session was healthy the whole time - browse proved that. The second is reading the Value attribute and never the AccessLevel and UserAccessLevel attributes that actually explain the denial.

Another is assuming anonymous access that browses will also read; hardened servers deliberately split those. And do not confuse BadNotReadable, which is a property of the node, with BadUserAccessDenied, which is a property of your session. The first means nobody reads this; the second means not you. They point at different fixes.

Frequently Asked Questions

Why can I browse an OPC UA node but not read its value?

Browse rights and read rights are granted separately. A server commonly lets anonymous or low-privilege sessions browse the address space structure while requiring an authenticated user with a read-capable role to read live values. Check the session identity, then the node's AccessLevel and UserAccessLevel attributes to see whether the node or your role is the blocker.

What is the difference between BadUserAccessDenied and BadNotReadable?

BadUserAccessDenied is about your session: the node is readable in principle but your authenticated identity or role is not allowed. BadNotReadable is about the node: its AccessLevel does not include CurrentRead, so no session can read it - a write-only setpoint node is the classic example. The two point at different fixes.

Do I need to reconnect after a permission change takes effect?

Usually yes. Access decisions are typically bound at session creation, so a role or permission change made while your session is open often will not apply until you create a fresh session. Reconnect, then re-read the node and confirm UserAccessLevel now includes read before concluding the change worked.

Sources and verification

This page references the protocol specifications published by the organizations below. Editions, product capabilities, and documentation change over time - confirm current requirements and specifications directly with the source.

Merobix is not affiliated with, endorsed by, or sponsored by these organizations; their names are used only to identify the standards and products discussed.

More in Industrial Protocols
Fix a Sparkplug Stale Metric After Reconnect  •  Fix an OPC UA Subscription Not Delivering Changes  •  Fix OPC UA BadTooManyMonitoredItems  •  Fix OPC UA certificate trust errors  •  Fix OPC UA session timeout loops  •  All Industrial Protocols →
Free SCADA operator training
Merobix University - 70 video lessons & 261 quiz questions, from first login to compliance reporting. No demo call required.
Start free →