Section 4 of 6

Policy-Based Authorization

🎯 What You'll Learn

  • What are policies
  • Creating policies
  • Combining requirements
  • Using policies
  • Policy advantages

What are Policies?

Policies are named authorization rules that combine multiple requirements (roles, claims, custom logic) into reusable authorization strategies.

Creating Simple Policies

Program.cs C#
builder.Services.AddAuthorization(options =>
{
    // Require authenticated user
    options.AddPolicy("RequireAuth", policy =>
        policy.RequireAuthenticatedUser());

    // Require specific role
    options.AddPolicy("RequireAdmin", policy =>
        policy.RequireRole("Admin"));

    // Require specific claim
    options.AddPolicy("ITOnly", policy =>
        policy.RequireClaim("Department", "IT"));
});

Combining Requirements

Multiple Requirements (AND) C#
options.AddPolicy("AdminInIT", policy =>
{
    policy.RequireRole("Admin");
    policy.RequireClaim("Department", "IT");
});
Age Requirement C#
options.AddPolicy("Over18", policy =>
    policy.RequireAssertion(context =>
    {
        var birthDate = context.User.FindFirst("BirthDate")?.Value;
        if (DateTime.TryParse(birthDate, out var date))
        {
            var age = DateTime.Today.Year - date.Year;
            return age >= 18;
        }
        return false;
    }));

Using Policies

[Authorize(Policy)] C#
[Authorize(Policy = "RequireAdmin")]
public class AdminController : Controller
{
    public IActionResult Index()
    {
        return View();
    }
}

[Authorize(Policy = "AdminInIT")]
public IActionResult ITAdmin()
{
    return View();
}

InvenTrack Example

Program.cs - InvenTrack Policies C#
builder.Services.AddAuthorization(options =>
{
    options.AddPolicy("CanManageProducts", policy =>
    {
        policy.RequireRole("Admin", "Manager");
        policy.RequireClaim("CanEditProducts", "true");
    });

    options.AddPolicy("CanDeleteProducts", policy =>
        policy.RequireRole("Admin"));
});
ProductsController.cs C#
public class ProductsController : Controller
{
    [Authorize]
    public IActionResult Index()
    {
        return View();
    }

    [Authorize(Policy = "CanManageProducts")]
    public IActionResult Edit(int id)
    {
        return View();
    }

    [Authorize(Policy = "CanDeleteProducts")]
    public IActionResult Delete(int id)
    {
        return View();
    }
}

Policy Advantages

  • Reusable: Define once, use everywhere
  • Testable: Easy to unit test
  • Maintainable: Change logic in one place
  • Flexible: Combine multiple requirements
  • Readable: Named policies are self-documenting

Key Takeaways

  • Policies: Named authorization rules
  • AddPolicy(): Define policies
  • RequireRole/RequireClaim: Add requirements
  • RequireAssertion(): Custom logic
  • [Authorize(Policy)]: Apply policy
  • Combine requirements: Multiple conditions (AND)