Security Measures

Okta SSO Integration – Angular SPA & C# API

Target architecture

Set up Okta and connect Windows AD

Create Okta apps for Angular SPA and C# API

Angular SPA
API Resource Server

Wire up Angular with Okta

Secure the C# API

Deploy on AWS

End‑to‑end SSO flow

Code

Angular – Install Packages

npm install @okta/okta-angular @okta/okta-auth-js

Angular – okta-config.ts

export const oktaConfig = {
  issuer: 'https://{yourOktaDomain}/oauth2/default',
  clientId: '{yourSpaClientId}',
  redirectUri: window.location.origin + '/callback',
  scopes: ['openid', 'profile', 'email', 'api.read'],
  pkce: true,
};

Angular – AppModule

import { OktaAuth } from '@okta/okta-auth-js';
import { OktaAuthModule, OKTA_CONFIG } from '@okta/okta-angular';
import { oktaConfig } from './okta-config';

const oktaAuth = new OktaAuth(oktaConfig);

@NgModule({
  imports: [BrowserModule, AppRoutingModule, OktaAuthModule],
  providers: [{ provide: OKTA_CONFIG, useValue: { oktaAuth } }],
  bootstrap: [AppComponent]
})
export class AppModule {}

Angular – Routes

const routes: Routes = [
  { path: 'callback', component: OktaCallbackComponent },
  { path: 'secure', component: SecureComponent, canActivate: [OktaAuthGuard] },
  { path: '**', redirectTo: 'home' }
];

Angular – HTTP Interceptor

@Injectable()
export class AuthInterceptor implements HttpInterceptor {
  constructor(private oktaAuth: OktaAuth) {}

  async intercept(req: HttpRequest, next: HttpHandler) {
    const accessToken = await this.oktaAuth.getAccessToken();

    if (accessToken && req.url.startsWith('https://your-api-host')) {
      req = req.clone({
        setHeaders: { Authorization: `Bearer ${accessToken}` }
      });
    }

    return next.handle(req);
  }
}

C# – Add JWT Package

dotnet add package Microsoft.AspNetCore.Authentication.JwtBearer

C# – Program.cs

var builder = WebApplication.CreateBuilder(args);

var oktaDomain = builder.Configuration["Okta:Domain"];
var audience   = builder.Configuration["Okta:Audience"];

builder.Services
    .AddAuthentication(options =>
    {
        options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
        options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
    })
    .AddJwtBearer(options =>
    {
        options.Authority = $"{oktaDomain}/oauth2/default";
        options.Audience = audience;
    });

builder.Services.AddAuthorization();
builder.Services.AddControllers();

var app = builder.Build();

app.UseRouting();
app.UseAuthentication();
app.UseAuthorization();

app.MapControllers();
app.Run();

C# – Secure Controller

[ApiController]
[Route("api/[controller]")]
[Authorize]
public class ValuesController : ControllerBase
{
    [HttpGet]
    public IActionResult Get() => Ok(new { message = "Secure data" });
}