Policy Inheritance & Evaluation Order in Okta
A friendly, ground-up guide to how Okta decides which policy and which rule applies to a sign-in. You will learn the first-match model, how priority order, groups, default policies, and catch-all rules really work, and how to design and test policies so that nothing surprises you.
Imagine a school with a long list of rules. One says students must wear uniforms. Another says seniors may wear casual clothes on Fridays. A third says anyone on the sports team wears team colors on game days. Now a senior who is on the sports team walks in on a Friday that is also a game day. Which rule wins? Someone has to decide the order in which the rules are checked, or the school will argue about it every single week.
Okta has the same problem, only with thousands of people, hundreds of apps, and security at stake. Okta uses policies to decide things like who must prove their identity with a second step, how long a session lasts, what a password must look like, and which people may open which apps. Every sign-in has to be matched against these policies. When two policies could both apply, Okta needs a clear rule for choosing. That rule is the evaluation order.
Many people expect Okta policies to work like family traits, where a child inherits from a parent, or like layers that all combine. They do not. Okta mostly works by checking a list from top to bottom and stopping at the first match. This guide explains that idea from scratch, so you can predict what Okta will do, design policies that behave, and find the cause quickly when something does not work as expected. You do not need any prior knowledge. Every new term is explained when it first appears, and each big idea comes with an everyday comparison.
Okta changes its products over time. Policy names, screens, available conditions, and defaults can differ between the Classic Engine and the Identity Engine, between releases, and between licenses. Treat this guide as a map of the ideas, and confirm the exact names and behavior in your own Okta Admin Console and the official Okta documentation before you change anything in production.
1Why Evaluation Order Matters So Much
Policies are only useful if they do what you meant. Order decides whether they do.
Suppose you write two policies. The first says, “Everyone in Finance must use a strong proof of identity.” The second says, “Everyone in the company may sign in with a simple proof.” If both match a Finance employee, which one does Okta use? If you are not sure, then you do not control your own security. The answer depends entirely on which policy sits higher in the list.
Small order mistakes, large consequences
A single misplaced policy can quietly weaken security. A broad “everyone” policy placed above a strict “executives only” policy means the executives never see the strict one, because Okta stops at the first match. The strict policy still exists. It still looks correct on the screen. It simply never runs for the people it was written for. This is one of the most common and least noticed mistakes in real Okta organizations.
The opposite mistake
Order mistakes can also lock people out. A strict rule placed above a friendly one can demand a method of proof that a group of users has not set up. Those people then cannot sign in at all, and the help desk fills with calls. When a whole department is locked out on a Monday morning, the cause is often a policy that was added in the wrong position.
Think of a bouncer with a printed list. The bouncer reads the list from the top and follows the first line that describes the person at the door. If the first line says “Let everyone in,” the later lines about VIP checks never get read. The list is correct, but the order makes it useless. Okta policy order works exactly like that list.
What you will gain from this guide
By the end, you will be able to look at a person, an app, and a situation, and say with confidence which policy and rule will apply. You will know how to arrange policies so the most specific ones come first. You will know why default policies exist, how catch-all rules protect you, and how to test changes before they reach real users.
Whenever you feel confused about a policy, ask two questions in order: which policy applies to this person, and then which rule inside that policy applies. Almost every puzzle in Okta policy work comes down to those two questions.
2Core Concepts You Need First
A small set of words appears again and again in this topic. Learn them once and the rest reads easily.
Policy
A policy is a named collection of instructions about one area of Okta. There are policies about passwords, about how people sign in, about which methods of proof they may set up, and more. A policy by itself is like a folder. The real instructions sit inside it as rules.
Rule
A rule is one instruction inside a policy. Each rule has conditions, which say when the rule applies, and an action, which says what to do. For example: “If the person is outside the office network, then require a second proof.” A policy usually holds several rules, arranged in order.
Condition
A condition is a test. It asks a question about the situation, such as “Is the person in the Finance group?” or “Is the sign-in coming from a known network?” A rule applies only when all of its conditions are true.
Priority
Priority is the position of a policy or rule in its list. The one at the top has the highest priority and is checked first. Moving a policy up the list makes it more important. Priority is how you tell Okta which instruction should win when more than one could apply.
First match wins
This phrase is the heart of the whole guide. Okta walks down the list, finds the first item whose conditions fit, applies it, and stops. Items below it are not checked at all, even if they would also fit.
Default policy and catch-all rule
A default policy is the safety net at the bottom of a list of policies. It applies to everyone who did not match anything above it. A catch-all rule is the safety net at the bottom of a list of rules inside a policy. It applies to any situation that no earlier rule described. Both exist so that no sign-in is ever left without an answer.
Group
A group is a named collection of people, such as “Finance” or “Contractors.” Groups are the most common way to decide which policy applies to whom.
Policy
A named collection of rules about one area, such as passwords or app sign-in.
Rule
One if-then line inside a policy, with conditions and an action.
Condition
A question about the situation, such as group, network, or device.
Priority
The position in a list. Higher positions are checked first.
Default and catch-all
The last policy and last rule that catch anything nothing above matched.
Group
A named set of people, often used to choose who a policy applies to.
Picture an airline with a rulebook. Each chapter is a policy: baggage, boarding, meals. Inside each chapter are numbered rules: “If the passenger is under two years old, then…” The conditions are the “if” parts, and the actions are the “then” parts. The airline checks the numbered rules from the top. The final rule in every chapter reads, “In all other cases, do this.” That last rule is the catch-all.
3The Okta Policy Family at a Glance
Okta has several kinds of policies. Each answers its own question, and each has its own ordering list.
It helps to think of Okta policies as a family with several members. They share common habits, such as priority and rules, but they have different jobs. The most important idea to remember is that Okta keeps a separate ordered list for each kind of policy. A password policy never competes with a sign-in policy, because they live in different lists and answer different questions.
| Policy type | Question it answers | Where it applies |
|---|---|---|
| Global session policy (Identity Engine) or Okta sign-on policy (Classic) | How do people get into Okta itself, and how long does the session last? | At sign-in to Okta |
| Authentication policy (Identity Engine) or app sign-on policy (Classic) | What proof does this particular app require? | When opening an app |
| Password policy | What must a password look like, and how do resets work? | When setting or changing a password |
| Authenticator enrollment policy (Identity Engine) or MFA enrollment policy (Classic) | Which methods of proof may or must people set up? | When enrolling in methods |
| Profile enrollment policy (Identity Engine) | What details are collected when someone signs up? | During self-service sign-up |
| Authorization server access policy | Which tokens may an application obtain for an API? | When an app requests tokens |
Separate lists, separate winners
For one sign-in, several of these policies may take part. The global session policy picks one winner. The app’s authentication policy picks another. The password policy may be consulted for rules about the password. Each type has exactly one winning policy for the person at that moment, and each winning policy has exactly one winning rule. Together, those winners shape the journey.
flowchart LR
P["One sign-in"] --> L1["Global session policies
one winner"]
P --> L2["Authentication policies
one winner for the app"]
P --> L3["Password policies
one winner for the user"]
P --> L4["Enrollment policies
one winner for the user"]
L1 --> R["Combined journey
from all the winners"]
L2 --> R
L3 --> R
L4 --> R
The diagram shows why Okta can feel layered. There is no single master list. There are several small lists, each choosing one winner, and the journey is built from all the winners together. When you troubleshoot, first work out which list you are looking at.
Think of a wedding with several committees: food, music, seating. Each committee keeps its own ordered checklist and picks its own plan. The wedding is the combination of all their decisions. If the music committee changes its list, the food does not change. Okta policy types are those committees.
Names and layouts differ between the Classic Engine and the Identity Engine. The first-match idea is shared, but where the lists live and what the rules can test can differ, so always confirm in your own console.
4The Inheritance Myth: What “Inherit” Really Means in Okta
The word inheritance sounds comforting, but it can mislead. Let us clear it up early.
In everyday speech, inheritance means passing something down. A child inherits eye color. In many computer systems, inheritance means a child object automatically receives settings from a parent. People new to Okta often assume policies work that way: a general policy sets a base, and more specific policies add to it or tweak it. That is not how most Okta policies work.
No blending of policies
Okta does not mix two policies together. If a person matches a strict policy and a relaxed policy, Okta does not take the strict parts of one and the relaxed parts of the other. It picks one policy, the highest on the list that matches, and applies that policy in full. Any settings in the lower policy are simply ignored for that person.
So where does inheritance appear?
The idea does show up in a few looser forms, and it helps to name them so they do not confuse you.
- Default fallback. If no custom policy matches a person, the default policy applies. You could say the person “falls back” to the default.
- Layering across policy types. The session policy, the app policy, and others each contribute a decision to the same sign-in. Their results stack up like layers, but each is chosen separately.
- Shared policies. One policy can be assigned to many apps. Change the policy once, and every app using it changes. This feels like inheritance, but it is really sharing.
- Group membership. A person gets the effects of every group they belong to when conditions test group membership. Membership accumulates, even though policies do not blend.
Think of choosing a recipe card from a box. You flip through the cards in order and pick the first one that fits tonight’s dinner. You then cook that card in full. You do not combine half of one recipe with half of another. Okta flips through the policy cards, picks the first fit, and follows it entirely.
Why this matters in practice
If you believe in blending, you will write a thin “extra” policy that only adds one stricter requirement, expecting the base rules to still apply underneath. In Okta, that thin policy will win for its audience and replace the base entirely. Every setting you did not repeat inside it is now missing for those people. Each policy must therefore be complete on its own for the audience it covers.
| Common belief | What actually happens |
|---|---|
| A specific policy adds to a general one | The specific policy replaces the general one for its audience |
| The strictest matching policy wins | The highest-priority matching policy wins, whether strict or not |
| All matching policies apply together | Only the first match in each policy type applies |
| Rules in lower policies still count | Lower policies are not evaluated after a match |
| Changing the default changes everyone | It changes only people who match nothing above it |
Some systems pick the strictest of all matching rules. Okta’s policy lists do not. The winner is decided by position, not by severity. If you want the strict rule to win, you must put it first.
5The Universal Rule: First Match Wins
Almost everything in this guide grows out of one simple procedure. Learn it well.
Here is the procedure in plain words. Okta looks at the list of policies of one type, starting at the top. For each policy, it asks, “Does this policy apply to this person in this situation?” If yes, Okta chooses it and stops looking. If no, Okta moves to the next one. When it runs out of custom policies, it reaches the default policy, which always applies.
flowchart TD
S["Start at the top of the list"] --> Q{"Does this policy
apply to the person?"}
Q -->|"Yes"| W["Choose this policy
stop checking"]
Q -->|"No"| N{"Is there another policy
below?"}
N -->|"Yes"| M["Move to the next policy"]
M --> Q
N -->|"No"| D["Use the default policy"]
Walking through an example
Imagine a password policy list with three entries, in this order. First, “Executives.” Second, “Contractors.” Third, the default. A contractor who is also a member of the Executives group signs in. Okta checks the first policy: is this person an executive? Yes. Okta chooses it and stops. The Contractors policy is never looked at, even though the person also fits it. If you wanted contractor rules to take priority for contractor executives, you would have to move the Contractors policy above Executives.
Ordering is a design decision
Because the list is read from the top, the order is a design choice, not a detail. The usual wisdom is to put the most specific and most restrictive policies first, and the broadest policies last. Specific policies apply to few people, so they must be checked before a broad policy swallows everyone.
Narrow and special
Small groups with special needs, such as administrators or high-risk roles.
Role-based
Department or role policies, such as contractors or finance teams.
Broad and general
Wide audiences, ideally covered by the default policy.
Default
The permanent safety net that catches everyone else.
Think of a hotel check-in desk with signs: “Suite guests this way,” “Group bookings this way,” “All other guests this way.” A suite guest who is also in a group booking must be told which sign to follow first. The signs are ordered from most specific to least specific so that people are not sent to the general line by mistake.
Inactive items are skipped
A policy or rule can be turned off. Inactive items are skipped during evaluation, as if they were not in the list. This is useful for preparing a change, but it can also surprise you: a policy that looks right on screen but is inactive does nothing. Always check the status as well as the position.
Whenever you add a new policy, ask where it should sit in relation to every existing one. Do not simply accept the position Okta gives a new item. Check the order on purpose.
6Rules Inside a Policy: A Second Round of First Match
Choosing a policy is only the first half. Inside the winning policy, Okta runs the same procedure again on its rules.
After Okta picks the winning policy, it opens that policy and reads its rules from the top. For each rule, it checks the conditions. The first rule whose conditions are all true wins, and its action is applied. Rules below the winner are not checked.
What a rule contains
A rule has three parts. The first is a name and status, such as “Office network, active.” The second is the set of conditions, such as the person’s group, the network zone, the device state, or the level of risk. The third is the action, which varies by policy type. In a sign-in policy, the action might be to allow access with a certain level of proof, to ask for extra proof, or to deny access. In a password policy, the action might set how often a password may be reset.
flowchart TD
A["Policy chosen"] --> R1{"Rule 1 conditions true?"}
R1 -->|"Yes"| X1["Apply Rule 1 action"]
R1 -->|"No"| R2{"Rule 2 conditions true?"}
R2 -->|"Yes"| X2["Apply Rule 2 action"]
R2 -->|"No"| R3{"Rule 3 conditions true?"}
R3 -->|"Yes"| X3["Apply Rule 3 action"]
R3 -->|"No"| CA["Catch-all rule
applies to anything left"]
All conditions must be true
A rule applies only when all of its conditions are true at the same time. If a rule says “Finance group, and on the office network, and on a managed device,” then a Finance person on the office network using a personal phone does not match. The rule is skipped, and Okta moves on. This “and” behavior means adding more conditions makes a rule narrower. A rule with no conditions at all matches everyone.
Order of rules is its own design problem
Just as with policies, rule order matters. A common pattern is to put exceptions first, then general rules, then the catch-all. For example: first a rule that denies access from a blocked risk level, then a rule that grants easy access from the office network, then a rule that asks for stronger proof from anywhere else. If the order is reversed, the easy rule could grab everyone before the blocking rule is read.
| Rule position | Example condition | Example action |
|---|---|---|
| 1 | Risk level is high | Deny access |
| 2 | On a managed device and on the office network | Allow with one proof |
| 3 | On a registered device | Allow with two proofs |
| Last | Anything else (catch-all) | Deny, or require the strongest proof |
Think of the instructions for a building’s fire alarm: “If there is smoke, evacuate. If there is a drill, gather outside. Otherwise, carry on.” The checks are ordered from most urgent to least. Putting “Otherwise, carry on” first would make the whole system useless. Rule order in Okta follows the same logic.
A rule with very broad or empty conditions matches almost everyone. If it sits above a more specific rule, the specific rule becomes unreachable. Review the top rules first when something seems to be ignored.
7The Default Policy and the Catch-All Rule
Every list has a safety net at the bottom. Understanding it protects you from the most dangerous surprises.
The default policy
For most policy types, Okta provides a default policy that already exists when your organization is created. It sits at the bottom of the list of that type, and it applies to everyone who did not match a policy above it. It generally cannot be deleted, and it stays last in the order. Because it applies to everyone left over, its settings quietly describe the experience of the largest group of people in your organization: everyone who is not special.
Why the default deserves attention
Many teams treat the default policy as a leftover and never look at it. That is a mistake. If you create a custom policy for only a few groups, then every other person falls to the default. A weak default means a weak experience for most of your organization. Since you cannot remove the default, the right move is to review it and set it to something you would be comfortable applying to the majority.
The catch-all rule inside a policy
Inside many policies, especially sign-in policies, there is a last rule often called the catch-all rule. It applies to any situation that none of the earlier rules described. Think of it as the sentence “in all other cases” at the end of a legal document. Without it, there would be gaps: situations where Okta has no instruction. A catch-all closes those gaps.
Choosing a safe catch-all action
The action of the catch-all is a security decision. A catch-all that denies access means any situation you did not think of is blocked, which is safe but may lock out legitimate cases you forgot. A catch-all that allows access with strong proof is a gentler choice. A catch-all that allows access with weak proof is risky, because every unanticipated situation gets easy access. Many teams prefer a safe catch-all and then add explicit rules above it for each situation they want to permit. Check what the starting action is on the policies you create, as the starting action can differ by policy type and engine.
flowchart TD
A["Person signs in"] --> B{"Matches a custom policy?"}
B -->|"Yes"| C["Use that policy"]
B -->|"No"| D["Use the default policy"]
C --> E{"Matches a rule in it?"}
D --> E
E -->|"Yes"| F["Apply that rule"]
E -->|"No"| G["Apply the catch-all rule"]
Think of a school with many special rules for sports teams, bands, and clubs. Students who belong to none of these still follow the standard school rules. That standard set is the default policy. Within each club’s rules, the final line says, “In any case not listed here, ask the teacher.” That is the catch-all rule. Both ensure nobody is left without guidance.
When you build a very specific policy, remember that everyone outside it falls to the default. After every policy change, ask: “Who falls through to the default now, and are we happy with that?”
Write down, in plain words, what your default policy and each catch-all rule do. Review that list whenever security requirements change. It takes five minutes and can prevent a serious gap.
A short checklist for the default and catch-all
Once a quarter, open each policy list and ask four plain questions. What does the default policy do today, and would I be happy if most people received it? Which people actually land on it, according to the log? What does each catch-all rule do, and was that a conscious choice? Has anything changed in the company, such as a new department or a new kind of contractor, that the safety nets no longer fit? Writing the answers down turns a vague worry into a small, repeatable review.
8Groups and Membership: How a Person Lands in a Policy
Policies do not pick people by name. They pick them by what the person belongs to and where the person is.
The most common way to decide who a policy applies to is by group membership. A policy or rule says, “This applies to the Finance group.” Okta checks whether the person is a member of that group at the moment of evaluation. If yes, the condition is true.
People can be in many groups
One person can belong to many groups at once: a department, a location, a project, a contractor group. This is where order matters most. If several of those groups appear in different policies, the policy that appears highest in the list wins. The person does not get a blend of all matching policies. They get the first one.
How people enter groups
People join groups in three main ways. An administrator can add them by hand. Group rules can add them automatically based on their profile, for example “if department is Sales, add to the Sales group.” Or groups can be imported from a directory such as Active Directory. Because group membership can change automatically, the policy a person receives can change too, without anyone touching the policy itself. When a person moves department, their group changes, and with it the policy that applies to them.
Timing of group changes
Group membership changes do not always take effect instantly. Group rules and directory imports run on their own schedule. A person added to a group by a rule may not see the new policy until the rule has run. Also, policies are evaluated at specific moments, as we will see later, so a change may only show up at the next evaluation.
flowchart LR
HR["Profile change
department moves"] --> GR["Group rule runs"]
GR --> GM["Group membership updates"]
GM --> PE["Next policy evaluation"]
PE --> NP["Different policy may apply"]
Designing groups for policies
Good policy design starts with good groups. Create groups that mean something for access, such as “Requires strong proof” or “Contractors,” instead of reusing groups made for email lists. Name them clearly so the reason they exist is obvious. Keep the number of overlapping groups low, so that predicting which policy applies does not require a flowchart for every person.
Think of a library with several membership cards: student, teacher, volunteer. A person who is both a student and a volunteer arrives at the desk. The librarian looks at the list of cards in a set order and follows the first one that applies. If the order changes, the person’s treatment changes, even though the person does not.
A policy design is easiest to reason about when most people belong to exactly one policy-relevant group. When many people belong to several, the order of the list carries all the weight and mistakes become likely.
9Global Session Policy: The First Gate
Before a person reaches any app, Okta decides how they get into Okta itself and how long that entry lasts.
The global session policy, in the Identity Engine, governs the Okta session. A session, you may recall, is the period during which Okta remembers that someone already proved who they are. The global session policy decides things like how the person signs in to Okta, whether a second proof is needed at that stage, and how long the session may last or sit idle before it ends.
How a policy is chosen
The global session policy list works like every other list. Policies are ordered. Each policy is assigned to groups of people. For a given person, Okta walks down the list and picks the first policy whose assigned groups include that person. If none match, the default global session policy applies. Inside the chosen policy, the rules are read in order, and the first rule whose conditions match is applied.
What the rules can look at
Rules in a session policy can test things such as the person’s network location, how the person authenticates, whether the sign-in comes from an external identity provider, and behavior or risk signals when available. The exact set of conditions can differ by engine and license, so check your console. The actions decide the session lifetime and how the person must prove themselves for that session.
Why this policy is special
The session policy comes first in the story of a sign-in. Whatever it decides becomes the background for everything after. A short idle limit here means people are asked to sign in again more often, regardless of what each app requires. It sets the floor of the experience.
| Step | What Okta does | Result |
|---|---|---|
| 1 | Find the person’s first matching global session policy | One policy chosen |
| 2 | Read its rules from the top | First matching rule chosen |
| 3 | Apply the rule’s action | Sign-in method, proof, and session length set |
| 4 | Create the session | Person may now open apps, subject to app policies |
Think of the main entrance to a large office building. The front desk decides how visitors enter and gives them a day pass that expires at a set time. Only after getting a pass can they reach any individual office, where a second set of rules may apply. The session policy is the front desk.
Keep your session policies few and clear. Because they apply before every app, a confusing session policy affects every person, every day.
10Authentication Policies and App Assignment
In the Identity Engine, each app has its own door rules, and the way those rules are attached to apps works differently from the session policy.
An authentication policy, sometimes called an app sign-in policy, describes what proof a person must give to open a particular app. It is made of rules, just like other policies. But unlike many other policy types, an authentication policy is not chosen by walking down a list of policies and checking groups on the policy itself. Instead, each application is assigned to one authentication policy directly.
One app, one policy
Every app points to exactly one authentication policy. There is no competition between policies here. The question “which policy applies?” is answered by the app’s assignment. The competition happens inside the policy, among its rules. The group tests that decide which people get which treatment sit in the rule conditions.
Sharing policies across apps
One authentication policy can be assigned to many apps. This is a powerful tool. Create a policy called “Sensitive apps” with strict rules, and assign it to your payroll, finance, and HR systems. When you tighten the policy, all of those apps tighten at once. This is the closest thing Okta has to inheritance: many apps sharing one definition. Note the trade-off. A change to a shared policy affects every app using it, so you must check the full list of apps before editing.
How the rules are read
When a person opens the app, Okta reads the rules of the app’s policy from the top. The first rule whose conditions match wins. Typical conditions include the person’s group, their user type, the device state, device assurance level, network zone, and risk. The action decides whether to allow access, how many and what kinds of proof are needed, and how often the person must prove themselves again. The last rule is the catch-all.
flowchart TD
APP1["Payroll app"] --> POL["Authentication policy
Sensitive apps"]
APP2["HR system"] --> POL
APP3["Finance app"] --> POL
POL --> RU1["Rule 1
High risk, deny"]
POL --> RU2["Rule 2
Managed device, strong proof"]
POL --> RU3["Rule 3
Catch-all, deny"]
Why this design helps
Because the policy is attached to the app, you can answer the question “what does this app require?” by looking at one place. Because rules carry the group conditions, a single policy can treat different groups differently. You avoid the need for many near-duplicate policies. The cost is that the order of rules inside a policy needs careful thought.
Think of a company with several secure rooms, each with a sign on the door that says which rulebook applies. Three rooms might point to the same rulebook titled “High security.” The rulebook is read from the top each time someone knocks. Updating the book updates all three doors at once.
Before editing a policy that many apps use, check the list of apps using it. A small tweak for one app may unintentionally change the rules for nine others.
11Classic Engine: Org-Level and App-Level Layering
In the older engine, the same idea is arranged in two layers that must both be satisfied.
In the Classic Engine, there is an Okta sign-on policy that applies to the whole organization, and each application has its own sign-on policy rules that apply to that app. The two work as layers. First, the org-level policy governs getting into Okta. Then, when the person opens an app, the app’s own rules may demand more.
Layer one: the Okta sign-on policy
The Okta sign-on policy has an ordered list of policies, each assigned to groups, and each holding ordered rules. Okta picks the first policy matching the person, then the first matching rule in it. That rule decides whether the person needs a second proof to enter Okta, how long the session lasts, and similar matters.
Layer two: the app sign-on policy
Each app has its own sign-on policy, made of rules. These rules are read from the top and the first match wins. A rule can require a second proof for that app, regardless of what the org-level policy asked, or deny access from certain locations. Here the app rules do not replace the org policy. They add a second checkpoint.
How the layers combine
The outcome is that the person must pass the org-level gate and then the app-level gate. If the org gate is strict and the app gate is lenient, the person still faces the strict org gate when first signing in. If the org gate is lenient and the app gate is strict, the person enters Okta easily but faces extra checks when opening the sensitive app.
sequenceDiagram
participant P as Person
participant O as Org Sign-On Policy
participant A as App Sign-On Rules
participant X as Application
P->>O: Sign in to Okta
O->>O: First matching policy, then first matching rule
O-->>P: Session created with required proof
P->>A: Open the application
A->>A: First matching app rule
A-->>P: Extra proof or allow or deny
P->>X: Access granted
| Question | Classic Engine | Identity Engine |
|---|---|---|
| How do people get into Okta | Okta sign-on policy rules | Global session policy |
| How is the app policy attached | Rules live inside each app | App points to a shared authentication policy |
| Can apps share one definition | Not in the same way | Yes, one policy for many apps |
| Where do group tests sit | Policy assignment and rule conditions | Mostly rule conditions in app policies |
Think of a theme park. The main gate checks your ticket. Individual rides then check your height. A person must pass both. A strict gate does not remove the need to pass the ride check, and a lenient gate does not excuse you from it.
When organizations upgrade from Classic to the Identity Engine, the two-layer arrangement changes into the session policy plus shared authentication policies. Policies should be redesigned from intent, not copied rule by rule.
12Password, Enrollment, and Profile Enrollment Policy Order
Several policy types decide things about the person, not the app. They follow the group-based, first-match pattern.
Password policies
A password policy sets rules for passwords: minimum length, how complex, how often to change, how many failed tries before a lock, and how resets work. Okta keeps an ordered list of password policies, each assigned to groups. For a given person, Okta picks the first policy in the list that matches one of the person’s groups. If none match, the default password policy applies. A person in two groups with different password policies receives the higher-priority one only, not a combination.
Authenticator enrollment policies
In the Identity Engine, an authenticator enrollment policy decides which methods of proof a person may or must set up. In Classic, a similar idea is called an MFA enrollment policy. Again, there is an ordered list of policies assigned to groups, plus a default. The first match decides, for that person, which authenticators are required, optional, or not allowed.
Profile enrollment policies
A profile enrollment policy describes what details are collected when someone signs up for an account themselves, and whether approval is needed. These policies are attached to apps, so the answer to “which one applies?” depends on the app the person is signing up for.
Password policy
Ordered list, assigned to groups. First matching policy wins, default last.
Enrollment policy
Ordered list, assigned to groups. First matching policy wins, default last.
Profile enrollment
Chosen by the app the person signs up to, with a default available.
Rules
Each policy may hold rules that refine its behavior, read in order.
The interaction between them
These policies do not compete, but they affect each other in practice. An authentication policy may demand a certain authenticator, while the enrollment policy of the same person forbids setting it up. The person is then stuck. The fix is to keep these policy types in agreement. Whenever you tighten what an app requires, check that the people affected are allowed to enroll in the needed method.
flowchart LR
AP["App policy
requires a security key"] --> CHK{"Does the person's
enrollment policy allow it?"}
CHK -->|"Yes"| OK["Person enrolls and signs in"]
CHK -->|"No"| STUCK["Person is stuck
fix enrollment policy"]
Think of a gym that requires a keycard to enter a class, while the front desk is not allowed to issue keycards to some members. Each rule makes sense alone, but together they trap people outside. Checking that your rules cooperate is part of good design.
One of the most common lockouts is not a single wrong rule. It is two correct rules that disagree. Always trace the full path for a sample person: which method is demanded, and may that person enroll in it?
13Conditions Deep Dive: What Rules Can Test
Conditions are the questions rules ask. Knowing the common ones helps you write rules that match exactly the people you mean.
The set of available conditions depends on the policy type, the engine, and your license, so use this chapter as a guide to the kinds of questions rules can ask, and confirm the exact list in your console.
Who is the person?
The most common condition is group membership, which asks whether the person belongs to a chosen group. Some policies can also test the user type, which is a label that separates kinds of users, such as employees and partners. These conditions narrow a rule to an audience.
Where is the person?
Location conditions use network zones. A network zone is a named set of network addresses, such as the office network or a list of countries. A rule can say, “Only when the sign-in comes from this zone,” or “Only when it does not.” Network location is a useful clue, but never a perfect one, because people travel and attackers use disguises.
What device is the person using?
Device conditions ask whether the device is registered with Okta, managed by the company, or meets a chosen level of health, called device assurance. Platform conditions ask whether the device is a phone, a laptop, or something else. These conditions let you say, “Easy access from a managed laptop, stronger proof from anything else.”
How risky does it look?
Risk and behavior conditions use signals that suggest an unusual sign-in, such as a sudden jump to a faraway country or unusual patterns. Rules can require extra proof, or deny access, when risk is high. The availability of these signals varies by license.
Which kind of sign-in is this?
Some rules look at how the person is authenticating, for example through Okta directly or through an external identity provider. Others look at the app or the type of request. These help separate different kinds of traffic into different rules.
Group and user type
Decides which audience the rule is aimed at.
Network zone
Matches office networks, countries, or blocked locations.
Device state and assurance
Distinguishes managed, registered, and healthy devices from unknown ones.
Risk and behavior
Reacts to signals that a sign-in looks unusual.
Combining conditions
Conditions within one rule are combined with “and.” A rule matching “Finance, and managed device, and office network” is quite narrow. If you need an “or,” such as “the office network or a trusted partner network,” you can usually place both in one network zone condition, or write two separate rules in order.
Think of a club’s door policy: “Members only, with ID, before midnight.” Each part is a condition, and the person must satisfy all of them. Add more parts and fewer people qualify. Remove parts and more get in.
Start with the fewest conditions that describe your intent. Every added condition is another place for a mistake to hide, and another thing to test.
14Network Zones and Blocklists in the Order of Things
Network zones are used as conditions, but they also play a special role as a blocking tool that can act before policies are read.
A network zone is a named set of network locations. Okta lets you define zones by lists of addresses, or by other attributes depending on your features. Zones are reused in many rules, so one definition can serve many policies. Change the zone once, and every rule using it changes with it.
Zones as conditions
In a rule, a zone condition can be positive or negative. A positive test says “when the sign-in comes from this zone.” A negative test says “when it does not.” This lets you separate office traffic from everything else, and apply easier rules to the first and stricter rules to the second.
Blocklist zones
Okta also supports blocklist behavior, in which sign-ins from a listed set of locations are blocked outright. This type of block is generally enforced very early, ahead of the normal policy rules, so a request from a blocked location is stopped even if a policy rule would have allowed it. Check your documentation for exactly how and where your organization applies this, since the details differ by feature and release.
flowchart TD
R["Sign-in request"] --> B{"From a blocked zone?"}
B -->|"Yes"| X["Blocked immediately
policies not consulted"]
B -->|"No"| P["Normal policy evaluation
first match wins"]
P --> O["Outcome"]
Why this ordering is important
If you are surprised that a person is blocked even though a rule says “allow,” look for a blocklist zone. The block is not a rule in the usual list, so you will not find it by reading policies. It sits in front of them. Similarly, adding a location to a blocklist is a very strong action: it overrides your carefully designed allow rules. Use it deliberately.
Keeping zones tidy
Zones go out of date. Offices move, vendors change addresses, and travel patterns shift. Review zones on a schedule, name them clearly, and record who owns each. An old zone that still lists a retired office address could silently trust a network that now belongs to someone else.
Think of a stadium. Before anyone reaches the ticket checkers, security turns away people on a banned list at the outer gate. The ticket checkers inside never see them. The blocklist is the outer gate. The policies are the ticket checkers.
An address in a trusted zone is a useful hint, not proof of identity. Attackers can route traffic through trusted-looking places. Use zones to adjust the amount of proof, not to remove it altogether.
15Authorization Server Access Policies: A Different List for APIs
Apps that call APIs use tokens, and a separate set of policies decides which tokens may be issued.
An authorization server is the part of Okta that issues tokens, which are signed proofs that let an application call an API on behalf of a person. Okta lets you create custom authorization servers, each with its own access policies. These are a different family from the sign-in policies we have discussed, but they follow a similar logic.
How access policies are chosen
Each authorization server holds an ordered list of access policies. Each policy is assigned to certain client applications, meaning the apps that request tokens. When an app asks for a token, Okta walks down the list and picks the first policy that applies to that client. Inside the policy, Okta walks down the rules, which can test the type of request, the person’s group, and the scopes requested. The first matching rule decides the details, such as the allowed scopes and how long the token lasts.
No match means no token
An important difference from the sign-in policies: there is no automatic default that lets everyone through. If no access policy covers the client, or no rule in the chosen policy matches the request, the request is refused. This is a safe default, but it is also a common reason that an API call suddenly fails. When tokens are refused, check that a policy and a rule actually cover the client and the request.
sequenceDiagram
participant C as Client App
participant S as Authorization Server
participant P as Access Policies
participant R as Policy Rules
C->>S: Request a token with chosen scopes
S->>P: First policy assigned to this client
P-->>S: Policy found or none
S->>R: First rule matching the request
R-->>S: Allowed scopes and lifetime
S-->>C: Token issued or request refused
Keep the two worlds apart in your mind
Sign-in policies decide how a person proves who they are. Access policies decide which tokens an application may receive after that. They have separate lists, separate orders, and separate winners. A person may pass sign-in easily and still find that an app is refused a token because an access policy does not cover it.
Think of a conference. Registration checks who you are and gives you a badge. A separate desk decides which workshop rooms your badge opens. Passing registration does not guarantee that every workshop will let you in.
When a token request fails, find out which authorization server was used, then check whether a policy is assigned to the client and whether a rule matches the grant type, the user, and the scopes.
16The Full Journey: Every Layer in One Sign-In
Now we put the pieces together and follow one person through every layer of evaluation.
Let us follow a person named Meera, who is a member of both the Finance and Contractors groups. She opens a payroll app from a personal laptop at home. Here is the order in which Okta considers her.
sequenceDiagram
participant M as Meera
participant Z as Blocklist Check
participant G as Global Session Policy
participant A as App Authentication Policy
participant E as Enrollment and Password Policies
participant X as Payroll App
M->>Z: Request from home network
Z-->>M: Not blocked
M->>G: Sign in to Okta
G->>G: First matching policy then rule
G-->>M: Session proof required
M->>A: Open the payroll app
A->>A: App policy rules read in order
A-->>M: Strong proof on registered device needed
M->>E: Check allowed methods
E-->>M: Method allowed or enroll
M->>X: Access granted
Step by step
First, the request is checked against any blocklist. Meera’s home network is not listed, so she continues. Second, the global session policy list is read from the top. Meera is in two groups, so the first policy that matches either group wins. Say the Contractors policy sits above Finance. Then Meera receives the contractor session rules, whatever the Finance policy would have said. Third, within that policy, the first matching rule applies. Fourth, when she opens the payroll app, the app’s authentication policy is read, and its rules are checked in order against her groups, device, and location. Fifth, if the rule demands a strong proof, Okta checks which methods her enrollment policy allows and whether she has one set up. If all is satisfied, she gets in.
Why this walkthrough is useful
It shows that at least four separate decisions shape Meera’s day, each taken from a separate list. If something goes wrong, you do not search one giant rulebook. You find the step that failed and open that list. The System Log, which we will cover later, shows which policy and rule applied at each step.
Blocklist
Is the request from a blocked location? If so, stop.
Session policy
Pick the first matching policy and rule. Decide how to enter Okta.
App policy
Read the app’s rules in order. Decide the proof for this app.
Enrollment and password policies
Confirm the person can use the demanded methods and meet password rules.
Access and tokens
If the app calls APIs, authorization server policies decide token issuing.
Think of boarding an international flight. You pass airport entry checks, then security, then the gate, then passport control at arrival. Each checkpoint has its own officer and its own list. Passing one does not skip the next, and failing one stops the journey at that point.
17When Are Policies Evaluated? Timing and Re-Evaluation
Policies are not checked continuously. They are checked at certain moments, and knowing those moments explains many mysteries.
At sign-in
The global session policy is evaluated when a person creates a session by signing in to Okta. The decisions made then, such as the session length, last for the life of that session. A later change to the session policy does not usually rewrite sessions that already exist. The new rules take effect the next time someone signs in.
At app access
App policies are evaluated when a person opens an app. Rules can include a re-authentication frequency, which asks the person to prove themselves again after a set period, even if the session is still alive. This means an app policy can be stricter than the session in time. A sensitive app might ask for a fresh proof every hour, while a casual app might not ask again all day.
At enrollment, password, and token moments
Enrollment and password policies are evaluated when a person sets up a method, changes or resets a password, or is asked to enroll. Authorization server policies are evaluated every time an app requests a token. Each policy type has its own trigger moment.
Why changes seem delayed
When an administrator edits a policy and a user reports no change, it is usually timing. The person’s session is still alive, the person has not yet opened the app, or the group membership has not yet updated. To see a change quickly in testing, use a fresh private browser window and a new sign-in.
| Policy type | Evaluated when | What can make a change seem delayed |
|---|---|---|
| Global session policy | A new session is created | Existing sessions keep running |
| App authentication policy | The app is opened, and again on the re-authentication schedule | Person has not reopened the app |
| Password policy | Password is set, changed, or reset | Person has not changed the password yet |
| Enrollment policy | Person enrolls or is prompted to enroll | Person already enrolled earlier |
| Access policy | An app requests a token | Old tokens stay valid until they expire |
Think of changing the rules for a gym. A member who is already inside keeps working out. The new rule applies the next time someone swipes in at the door. Policy changes in Okta often take effect at the next “swipe,” not instantly for everyone already inside.
If you must cut off access urgently, do not rely only on a policy change. Existing sessions and tokens may continue. Use the tools Okta provides for ending sessions and revoking tokens as part of your response plan.
18Architecture and Components of Policy Evaluation
Now we zoom out to see the parts that cooperate every time Okta evaluates a policy.
Behind the scenes, the policy engine of Okta is a set of cooperating pieces. You do not need to know how they are coded. You only need a mental model of what each piece does, so you can reason about what goes wrong.
flowchart TB
REQ["Request
sign-in, app open, token"] --> CTX["Context builder
user, groups, device, network, risk"]
CTX --> SEL["Policy selector
walks the ordered list"]
SEL --> RUL["Rule matcher
walks the ordered rules"]
RUL --> ACT["Action
allow, step up, deny, set limits"]
STORE["Policy store
policies, rules, priorities"] --> SEL
STORE --> RUL
DIR["Directory
users and groups"] --> CTX
ZONES["Network zones"] --> CTX
ACT --> LOG["System Log
record of the decision"]
The parts, one by one
Context builder
Collects who the person is, their groups, device, network, and risk for this moment.
Policy selector
Walks the ordered list of policies and stops at the first that applies.
Rule matcher
Walks the ordered rules inside the chosen policy and stops at the first match.
Action
Allow, ask for more proof, deny, or set limits such as session length.
Policy store
Holds every policy, rule, status, and priority as you saved them.
System Log
Records what happened so you can review it later.
The diagram shows that the same two-step walk happens everywhere. A request arrives. A context is built. The selector picks a policy. The matcher picks a rule. An action results. The decision is logged. Understanding this pipeline helps you localize a problem: bad context, wrong order, mismatched conditions, or an unexpected action.
Think of a court clerk who receives a case. The clerk gathers the facts, finds the first applicable law in an ordered book, finds the first applicable clause within it, announces the result, and writes it in the record. The clerk does not invent rules. The quality of the outcome depends on how the book is arranged.
If the context is wrong, the best-ordered policies still give a wrong answer. Stale group membership, outdated zone lists, and missing device information are common causes of surprising decisions.
19Worked Examples: Predicting the Winner
The best way to master evaluation order is to practice. Here are three examples, each solved step by step.
Example 1: Two password policies, one person
A company has three password policies in this order. First, “Admins,” assigned to the Administrators group, with a long minimum length. Second, “Contractors,” assigned to the Contractors group, with a shorter lifetime. Third, the default. A person named Dev is in both Administrators and Contractors. Which password policy applies?
Okta starts at the top. Dev is an administrator, so the first policy matches. Okta applies “Admins” and stops. The Contractors policy is not read. Dev does not get the shorter lifetime from the Contractors policy, because policies do not blend. If the company wanted contractor administrators to follow contractor rules, it would have to place “Contractors” above “Admins” and accept that contractor rules would then replace the admin rules for those people.
Example 2: Rules in an app policy
An app policy has these rules in order. Rule 1: if risk is high, deny. Rule 2: if the person is in Finance and on a managed device, allow with one proof. Rule 3: if the person is in Finance, allow with two proofs. Rule 4 is the catch-all: deny. Now consider three people.
- Anil is in Finance, on a managed laptop, with normal risk. Rule 1 does not match, because risk is not high. Rule 2 matches. Anil gets in with one proof.
- Bela is in Finance, on a personal phone, with normal risk. Rule 1 does not match. Rule 2 does not match, because the device is not managed. Rule 3 matches. Bela gets in with two proofs.
- Chen is in Finance, on a managed laptop, but the sign-in looks high risk. Rule 1 matches first. Chen is denied, even though Rules 2 and 3 would have allowed access. The order is why the deny rule works.
Example 3: The rule that never runs
A different app policy has Rule 1: “Everyone, allow with one proof.” Rule 2: “Executives, require a security key.” Rule 3: catch-all, deny. An administrator is puzzled that executives are never asked for a security key. Reading the order explains everything. Rule 1 matches everyone, including executives, so Okta stops there. Rule 2 and the catch-all are unreachable. The fix is to move the executive rule above the broad rule, so the special case is read first.
| Person | Situation | Winning rule | Outcome |
|---|---|---|---|
| Anil | Finance, managed laptop, normal risk | Rule 2 | Allow with one proof |
| Bela | Finance, personal phone, normal risk | Rule 3 | Allow with two proofs |
| Chen | Finance, managed laptop, high risk | Rule 1 | Deny |
| Dina | Not in Finance, normal risk | Catch-all | Deny |
flowchart TD
S["Sign-in to the app"] --> R1{"Risk is high?"}
R1 -->|"Yes"| D1["Deny"]
R1 -->|"No"| R2{"Finance and managed device?"}
R2 -->|"Yes"| A1["Allow with one proof"]
R2 -->|"No"| R3{"Finance?"}
R3 -->|"Yes"| A2["Allow with two proofs"]
R3 -->|"No"| CA["Catch-all: deny"]
Think of a customs officer who first asks, “Are you carrying anything dangerous?” and only afterward asks, “Are you a resident or a visitor?” The most important question is asked first, so a dangerous item is stopped no matter who is carrying it. The same goes for a deny-on-high-risk rule at the top.
For every policy you build, write three imaginary people on paper and trace each one down the list. If you cannot predict the outcome, neither can the next administrator.
20Designing a Policy Model That Stays Understandable
Good policy design is less about clever rules and more about a simple structure that people can read.
Think in tiers
A tier model sorts apps and people into a few clear levels. For example, three app tiers: everyday tools, business-sensitive systems, and critical systems. Each tier gets one authentication policy. Everyday tools might allow easy access from trusted devices. Business-sensitive systems might require a stronger proof. Critical systems might require a strong proof on a managed device with no exceptions. Because many apps share one policy per tier, you manage three policies instead of thirty.
Order from specific to general
Inside every policy, arrange rules from the narrowest and most urgent to the broadest. Typical order: block or deny conditions first, special-case allow rules next, general rules after, and the catch-all last. In the policy lists, place small special-audience policies above the broad ones, with the default at the bottom.
Name things so the order makes sense
Good names make the list readable at a glance. Use a clear pattern, such as the tier, the audience, and the purpose. Number prefixes can help if you want the order to be visible even when the list is exported to a document. Avoid vague names like “New policy 2.”
Keep policies complete
Since policies do not blend, each policy must contain everything its audience needs. When you copy a base policy to create a variant, the variant should include all the base rules plus the differences. A short “delta only” policy is a trap.
Document the intent
Write a short description for each policy and rule: who it is for, why it exists, and who owns it. Descriptions are the only way a future administrator can tell whether an odd-looking rule is a mistake or a deliberate decision.
Tiers, not one-offs
A few shared policies for groups of similar apps beat many custom ones.
Specific before general
Special audiences and deny rules go first. Broad rules and catch-alls go last.
Names with a pattern
Tier, audience, and purpose make the list self-explaining.
Complete policies
Every policy stands alone, because nothing is inherited from the one below.
Written intent
Short descriptions of who, why, and owner on every policy and rule.
Clean groups
Groups made for access, with little overlap, keep outcomes predictable.
flowchart TD
T1["Tier 1 policy
everyday tools"] --> A1["Chat, wiki, calendar"]
T2["Tier 2 policy
business sensitive"] --> A2["CRM, ticketing, HR portal"]
T3["Tier 3 policy
critical systems"] --> A3["Payroll, admin consoles, source code"]
Think of a library with three sections: open shelves, reading room, and rare books. Instead of writing special rules for every book, the library writes three rule sets, one per section. New books simply join a section. Anyone can understand the system after a short walk through the building.
21Security Considerations
Policy order is a security control. Mistakes in it become security gaps or lockouts.
The silent gap
The worst failures are the ones nobody sees. A broad allow rule above a strict rule means the strict rule is never reached. The strict rule still appears in the console and gives everyone comfort, but it protects nobody. Regular reviews of the top of every list are the cure.
The catch-all as a last defense
Treat the catch-all rule as a security decision, not a leftover. A deny catch-all means that anything you did not plan for is blocked. This is safe, but it needs explicit allow rules above it for everything legitimate. A permissive catch-all means unplanned situations get through. Choose deliberately and record your reasoning.
Lockout and the break-glass account
A mistake in a policy can lock out everyone, including administrators. Protect against this with break-glass accounts. These are a small number of emergency administrator accounts, protected with very strong methods, excluded from risky policy experiments in a controlled way, monitored for any use, and tested on a schedule. They are the spare key you hide for the day the door jams.
Least privilege and separation of duties
Not everyone with admin rights needs to change sign-in policies. Use administrator roles so only a small trusted group can edit policies and their order. For sensitive changes, require a second person to review before the change goes live. A policy edit is a security change, even when it looks like a mere drag-and-drop.
Attackers and the order of things
Attackers seek the weakest path. If one app uses a lenient policy, attackers will aim for that app. If the default policy is weak, attackers will look for accounts that fall through to it. A consistent minimum across all policies, including the default, narrows the weak spots.
Auditability
Auditors will ask who changed the policy order and when. The System Log and your own change records should be able to answer. Keep a change note for every policy edit: what changed, why, who approved, and what the test result was.
| Risk | Example | Safeguard |
|---|---|---|
| Silent gap | Broad allow above strict rule | Regular review of top rules, simulated tests |
| Lockout | Strict rule demands unavailable method | Break-glass accounts, enrollment checks |
| Weak default | Default policy allows easy access | Review and strengthen the default |
| Unreviewed edit | One admin reorders rules alone | Roles, two-person review, change records |
| Stale zones | Old office address still trusted | Scheduled zone reviews with owners |
Think of a building’s fire exits. A well-designed building has several exits and an emergency key kept in a locked box. If someone accidentally bars the main door, people can still get out. Break-glass accounts are that locked box.
An emergency account that has never been tested is a wish, not a plan. Check it on a schedule, and confirm that alerts fire when it is used.
22Monitoring, Logging, and Simulation
To trust your policies, you must be able to see what they actually did.
The System Log as a witness
Okta’s System Log is a running diary of events. Many entries describe sign-in attempts and policy decisions. For a given event, the log can often show which policy and which rule applied, which methods were used, and what the outcome was. This is the single best tool for answering “why did this person get this result?” because it records Okta’s real decision, not your guess about it.
Reading a decision
When troubleshooting, search the log for the person and the time. Find the event for the sign-in or the app access. Read the details to see the policy and rule that were applied. If that is not the one you expected, you now know exactly where to look: either the person did not match the condition you expected, or something above it matched first.
Simulation tools
Okta offers tools in some versions that let administrators simulate how policies would apply to a chosen person, app, and situation without a real sign-in. These are very useful for checking order and conditions before a change reaches users. Availability and names vary by release and license, so check your console. If a simulation tool is not available to you, a test user in a test group, signing in from a private browser window, is a good substitute.
What to watch over time
Beyond individual cases, keep an eye on patterns. Watch for rising failure rates after a change, for many people hitting the catch-all rule, and for the share of sign-ins handled by the default policy. A growing number of people landing on the default may mean your custom policies no longer match how the company is organized.
flowchart TD
Q["Question: why this result?"] --> L["Search System Log for person and time"]
L --> E["Open the decision event"]
E --> W["Note policy and rule applied"]
W --> C{"Is it the one you expected?"}
C -->|"Yes"| F["Rule or action needs a change"]
C -->|"No"| G["Check conditions, groups, and order above it"]
Think of a referee who reviews the video replay after a disputed call. The replay shows what actually happened, not what players remember. The System Log is your replay for sign-in decisions.
Save a few useful log searches, such as sign-ins denied by the catch-all rule or sign-ins handled by the default policy. Run them weekly. They reveal gaps long before users complain.
23Change Management: Editing Policies Safely
Because order carries so much weight, every policy change deserves a small, repeatable routine.
Write the intent
Describe in plain words who should get what, and why, before touching the console.
Check the current order
Note the list as it stands, including inactive items, and take a screenshot or export.
List who is affected
Find the groups and apps touched by the change, and check shared policies for other users.
Test in a safe place
Use a test organization, a test group, or simulation tools before changing real users.
Get a second pair of eyes
Ask another administrator to trace three sample people through your new order.
Publish at a calm time
Avoid busy sign-in hours and tell the help desk what to expect.
Verify and record
Check the System Log for real decisions, then write a change note with the result.
Keep a way back
Know how to restore the previous order quickly if something goes wrong.
Use inactive rules to stage changes
One safe technique is to create a new rule as inactive, review the full list, and activate it only when you are ready. Inactive rules are skipped, so the new rule cannot affect anyone until you switch it on. Remember to turn it on, since a forgotten inactive rule does nothing.
Small steps beat big bang
If you plan a major redesign, move in stages. Introduce the new structure for a pilot group, watch the results, and expand. A single big reorder that touches everyone at once is the classic recipe for a Monday-morning crisis.
Think of rearranging the signs in a busy train station. You would not move every sign overnight without checking the paths. You would place the new signs, walk the routes, ask a few travelers, and only then remove the old ones. Policy changes deserve the same care.
Reordering looks harmless, but one drag can change who gets which treatment across the whole company. Treat every reorder as seriously as writing a new rule.
24Advantages, Disadvantages, and Trade-offs of the First-Match Model
Okta’s approach is a deliberate design with real strengths and real costs.
Advantages
- Simple to explain: read from the top, stop at the first match.
- Predictable: the same person in the same situation gets the same result.
- Fast to evaluate and easy to log.
- Lets you place exceptions precisely where you want them.
- Shared policies make big changes quick and consistent.
- No hidden blending that nobody can predict.
Disadvantages
- Order mistakes can silently disable the policies you meant to enforce.
- Policies must be complete, which can cause duplication.
- Overlapping groups make outcomes hard to predict.
- Shared policies spread a mistake to many apps at once.
- Newcomers often expect inheritance and are surprised.
- Large lists become hard to read without discipline.
First match compared with other models
Other systems use different rules for resolving conflicts. Some choose the most restrictive result among all matches. Some combine permissions from every match. Some give explicit deny rules priority over allow rules. Each approach has strengths. The first-match model trades some safety nets for simplicity and control. You decide the winner, but you must be careful about the order.
| Model | How conflicts are resolved | Main risk |
|---|---|---|
| First match wins (Okta lists) | The highest-priority matching item is used | A misplaced broad item hides a strict one |
| Most restrictive wins | The strictest matching result is used | Hard to grant exceptions |
| Combine everything | All matching results are merged | Unexpected combined permissions |
| Deny overrides allow | Any deny beats any allow | One stray deny blocks legitimate use |
Think of settling a family argument by asking the oldest person present, versus asking the strictest person, versus averaging everyone’s opinion. Each method is easy to follow and gives different outcomes. Okta asks whoever is first in line, so the seating order is everything.
The model is only as good as the structure around it: few overlapping groups, complete policies, careful order, and regular review. With those habits, first match is easy to live with.
25Design Patterns and Anti-patterns
A pattern is a solution that keeps working. An anti-pattern is a tempting mistake that keeps hurting people.
Patterns worth copying
Deny first
Put block and high-risk deny rules at the top so nothing above them can allow a bad request.
Specific before general
Order from narrow audiences to broad ones, with the default last.
App tiers
Group apps into a few tiers, with one shared policy per tier.
Safe catch-all
End each policy with a catch-all that denies or demands strong proof, then allow explicitly above it.
Stage with inactive rules
Create new rules inactive, review the full list, then activate.
Three-person trace
Trace three imaginary users through every change before publishing.
Anti-patterns to avoid
What it looks like
A rule or policy that matches everyone sits above more specific ones.
Why it hurts
Everything below it becomes unreachable. Strict rules look present but protect nobody.
Better approach
Move special cases above general ones and review the top of every list regularly.
What it looks like
A new policy contains only the one change from the base policy, expecting the rest to carry over.
Why it hurts
Policies do not inherit. The delta replaces the base entirely, and everything not repeated is missing.
Better approach
Make every policy complete for its audience.
What it looks like
Custom policies are carefully built, while the default is left in its original, relaxed state.
Why it hurts
Most people fall through to the default, so the largest group gets the weakest treatment.
Better approach
Review the default first, and set it to something you would accept for most of the company.
What it looks like
An administrator edits a policy for one app without noticing that many other apps use it.
Why it hurts
A change meant for one app silently changes access for all of them.
Better approach
Check the list of apps using a policy before every edit, and create a new policy when needs differ.
What it looks like
People belong to many overlapping groups, and policies are assigned across all of them.
Why it hurts
Outcomes depend entirely on list order and are very hard to predict or explain.
Better approach
Create groups for access purposes with minimal overlap, and document which policy each group triggers.
26Best Practices and Common Mistakes
If you remember nothing else from this guide, remember the habits in this chapter.
Best practices
- Remember the two questions. Which policy applies, and then which rule inside it applies.
- Order from specific to general. Narrow audiences and deny rules go first.
- Make each policy complete. Nothing is inherited from the policy below.
- Own the default. Review it, and make it safe for the majority.
- Choose catch-alls deliberately. Deny or strong proof is usually the safer choice.
- Keep groups clean. Fewer overlaps mean fewer surprises.
- Test with sample people. Trace at least three through every change.
- Check shared policies before editing. Know every app that will be affected.
- Keep break-glass access. Emergency accounts, tested and monitored.
- Record intent and changes. Descriptions on policies and notes on edits.
Common mistakes
Okta picks by position, not by strictness. A relaxed policy above a strict one wins for the people it matches.
An inactive policy or rule is skipped. A carefully designed rule left inactive does nothing, and an old rule left inactive may be switched on by accident later.
Administrators often belong to special groups and use special devices. Test as ordinary people on ordinary devices.
Existing sessions and tokens continue, and group changes take time. Plan for the delay, and use session and token tools in emergencies.
An app that demands a method which the enrollment policy forbids locks people out. Check the full path for a sample person.
27Real-World Scenarios
These short stories use made-up companies to show how the ideas appear in everyday work. They are teaching examples, not descriptions of any real organization.
Scenario 1: The executives who were never asked
Northpeak Software wrote a rule requiring a security key for executives opening the finance app. An audit found that executives were signing in with a simple prompt. The team traced an executive through the app policy and found a broad rule, “Everyone on a registered device, allow with one proof,” sitting above the executive rule. They moved the executive rule to the top, tested three sample people, and recorded the change. The rule that had existed for months finally protected the people it was written for.
Scenario 2: Monday morning lockout
Brightwave Retail added a new authentication policy for a scheduling app that required a phone-based approval. On Monday, store staff could not open the app. The team found that the staff group’s enrollment policy did not allow the phone-based method, so nobody could set it up. They adjusted the enrollment policy, ran an enrollment campaign, and added a step to their change routine: check that people may enroll in whatever a policy demands.
Scenario 3: The contractor administrators
Harborline Group had a password policy for administrators and another for contractors. Contractor administrators were getting the administrator rules, with a long reset period that the security team considered too relaxed for contractors. The team realized the policies do not blend and the administrator policy was higher in the list. They created a dedicated policy for contractor administrators, placed it at the top, and made it complete on its own.
Scenario 4: The weak default
A mid-sized firm built excellent custom policies for finance and engineering, but a review of the System Log showed that sixty percent of sign-ins were handled by the default policy, which still had the starting settings from years earlier. The team strengthened the default, then re-tiered their apps so that fewer people depended on it silently. Support tickets did not rise, because the change was announced and tested.
What the scenarios share
Each story was solved by asking the same two questions, using the log to see the real decision, fixing the order or the completeness, and testing with sample people. None needed anything exotic. They needed discipline about order.
Firewall administrators in many industries face the same challenge. Their rule lists are read top to bottom, and a broad allow rule placed too early can undo careful work below it. The lesson carries across systems: ordered lists reward careful ordering and review.
28Troubleshooting Playbook
When a result surprises you, a calm and ordered approach finds the cause faster than guessing.
Almost every policy puzzle comes down to one of a few causes: the wrong policy won, the wrong rule won, the conditions did not match as expected, the policy is inactive, or the change has not yet taken effect. Work through them in order.
Problem: the rule I wrote is not being applied
Check three things. Is the rule active? Is there a broader rule above it that matches first? Do the person’s actual groups, device, and location satisfy all of the rule’s conditions? Use the System Log to see which rule did apply, then compare it to yours.
Problem: the person gets a policy they should not
List the groups the person belongs to, including any added by group rules or imports. Check the order of policies and see which group matches first. The person may belong to a group nobody remembered.
Problem: everyone is falling to the default
Check whether the groups assigned to your custom policies still contain the people you expect. Group rules may have stopped working, or a directory import may have changed. Also check that the policies themselves are active.
Problem: a person is blocked although a rule says allow
Look for a blocklist zone or another early block, which acts before the normal rules. Also check risk-based rules above the allow rule.
Problem: a change had no effect
Remember timing. The person may have a live session, or tokens may still be valid. Test from a fresh private browser window with a new sign-in, and wait for group changes to finish.
Problem: token requests fail for an app
Find the authorization server used. Check that an access policy is assigned to the client and that a rule matches the grant type, the person, and the scopes requested. No match means no token.
| Symptom | Most likely cause | First thing to try |
|---|---|---|
| Rule ignored | Inactive or shadowed by a broader rule | Check status and move the specific rule up |
| Wrong policy applied | Person in another group listed higher | List all groups and read the order |
| Many people on the default | Groups empty or policies inactive | Check group rules, imports, and status |
| Blocked despite allow | Blocklist or risk rule above | Check zones and top rules |
| No visible change | Live session or token | Test in a fresh private window |
| Token refused | No access policy or rule match | Check client assignment and rule conditions |
| Locked out after a change | Policy types disagree | Use break-glass access, then fix enrollment |
A doctor asks the same short questions in the same order: where does it hurt, when did it start, what changed. A fixed order of questions beats random poking, and it turns troubleshooting into routine.
Write down the cause and the cure in a shared runbook. The next person who sees the same symptom will thank you, and your policy design gets stronger every time.
29Frequently Asked Questions
Short answers to the questions people ask most often.
30Summary and Key Takeaways
Here is the whole story in a few lines you can carry with you.
Okta does not blend policies. For each policy type, it walks an ordered list, picks the first policy that applies to the person, then walks that policy’s ordered rules and picks the first rule whose conditions all match. Default policies and catch-all rules close every gap. Different policy types keep their own lists and their own winners, and a sign-in is shaped by all of them together. Because position decides the outcome, ordering is a security control. Good design means few overlapping groups, complete policies, specific rules first, a safe catch-all, careful testing, and the System Log to check what really happened.
Key Takeaways
- First match wins. Okta reads each list from the top and stops at the first policy or rule that applies. Position decides, not strictness.
- There is no real inheritance. A winning policy replaces the others for that person, so every policy must be complete on its own.
- Two questions solve most puzzles. Which policy applies, and which rule inside it applies.
- Defaults and catch-alls are your safety nets. Review the default policy and choose each catch-all action deliberately.
- Each policy type has its own list. Session, app, password, enrollment, and token policies each choose their own winner, and they must agree with each other.
- Order specific before general. Put deny and narrow rules first and broad rules last, or the broad rule hides the strict one.
- Test, log, and keep a way back. Trace sample people, read the System Log, stage changes with inactive rules, and keep tested break-glass access.