ASP.NET Core Security

40
ASP.NET Core Security Wie man sich ordentlich Anmeldet, Autorisiert und Daten schützt

Transcript of ASP.NET Core Security

Page 1: ASP.NET Core Security

ASP.NET Core SecurityWie man sich ordentlich Anmeldet, Autorisiert und Daten

schützt

Page 2: ASP.NET Core Security

Was gibt es heute?

Authentifizierung Autorisierung Datenschutz

Grundlagen Feinheiten

Page 3: ASP.NET Core Security

Was gibt es nicht?

• 1x1 ASP.NET Core• 1x1 ASP.NET Core MVC• Keine Erklärung des OpenId oder anderer Protokolls• Außer das was nicht verhindert werden kann ;)• Fragt wenn was unklar sein sollte.

Page 4: ASP.NET Core Security

Die Basics

• IPrincipal => ClaimsPrincipal• ClaimsIdentity• Claims• ALLES sind Claims• und das schon seit .NET 4.5

Page 5: ASP.NET Core Security

ClaimsPrincipal

• httpContext.User• controller.User• Bei .NET Core kein CurrentPrincipal am Thread• Thread.CurrentPrincipal und ClaimsPrincipal.Current nicht

nutzen• Also durchreichen wenn notwendig• per DI/IoC über IHttpContextAccessor im Constructor holen• direkt per IoC ClaimsPrincipal reinreichen (muss man manuell

machen)

Page 6: ASP.NET Core Security

Die ASP.NET Core Bausteine

Host

ASP.NET Core

Client Middleware Middleware Application

Page 7: ASP.NET Core Security

AuthenticationManager

• httpContext.Authentication

• AuthenticationScheme

• Zugriff auf die Schemas

• SignInAsync()• SignOutAsync()• ChallengeAsync()

Page 8: ASP.NET Core Security

Authentication mit Cookies

• Beinhaltet die Claims des angemeldeten Benutzer• Ist kryptograpisch sicher verschlüsselt• Quasi FormsAuthentication bei WebForms ;)

• Nuget: Microsoft.AspNetCore.Authentication.Cookies

• Docs: https://docs.microsoft.com/en-us/aspnet/core/security/authentication/cookie

Page 9: ASP.NET Core Security

Authentication mit Cookies

• Startup Klasse• Vor den zu schützenden

Bereich

Page 10: ASP.NET Core Security

Authentication mit Cookies

• SignInAsync()

Page 11: ASP.NET Core Security

Live CodingCookie basierte Anmeldung mit einem Formular

Page 12: ASP.NET Core Security

Authentication mit Cookies

• Name des AuthenticationScheme

• SignIn und SignOut über den Namen des Schemas

• Die Größe des Cookies nicht aus den Augen verlieren

• Name Claim nicht vergessen

• Return Url berücksichtigen, nur zu eigenen Seiten

• Per Events eingreifen

Page 13: ASP.NET Core Security

Authentication mit OpenId Connect

• Google• Office 365• Azure Active Directory• Identity Server 3 und 4• Microsoft Konto• und viele mehr

• Auf OAuth2 basierend

• Standard Claims

• Keine Authorisation

• Nur als exemplarisches Beispiel

• trotzdem viel Spielraum

Page 14: ASP.NET Core Security

Authentication mitOpenId Connect

• Startup Klasse• Vor den zu schützenden Bereich• Nach der Cookie Authentication

Page 15: ASP.NET Core Security

Authentication mitOpenId Connect

• Challenge selbst veranlassen

• Direkt über den AuthenticationManger

• Oder bei MVC über ChallengeResult

Page 16: ASP.NET Core Security

Live CodingOpenId Connect basierte Anmeldung,

zusammenspiel von AutomaticChallenge, Cookies und Co.

Page 17: ASP.NET Core Security

Authentication mit OpenId Connect

• Name Claim ist anderes

• Für zentrales Logout das id_token merken

• Komplettes Profil muss separat angefordert werden

• Braucht Cookies wenn man lokal anmelden will

• Per Events eingreifen

Page 18: ASP.NET Core Security

API Authentication mit Jwt Bearer Token

• Wie Cookie Authentication• Token muss schon vorhanden sein• Von externen Systemen

• Issuer Signing Key muss manuell gesetztwerden.

Page 19: ASP.NET Core Security

Microsoft ASP.NET Core Identity

• Nutzt die Authentication Provider• Benutzer, Claims für Benutzer• Rollen, Claims für Rollen• Externe Logins• Token Store• Zwei Faktor Authentication• Achtet auf den Kleinkram

Page 20: ASP.NET Core Security

Autorisierung

• Funktionen in einer Anwendung erlauben oder verbieten• Auf Basis der Benutzerinformationen

• Klassisch ist die Rollenbasierte Autorisierung• Claims basierte Autorisierung bis jetzt Stiefmütterlich

• Auch mit ASP.NET Core, nur besser

Page 21: ASP.NET Core Security

Policy basierte Autorisierung

• Definition zur Laufzeit• Eindeutigen Namen• Rollen• Claims• Werte für Claims• Assertions• Haben eine Liste von IAuthorizationRequirement• IAuthorizationRequirementHandler

Page 22: ASP.NET Core Security

Definition von Policies

Page 23: ASP.NET Core Security

IAuthorizationRequirement

Page 24: ASP.NET Core Security

IAuthorizationRequirementHandler

Page 25: ASP.NET Core Security

Anwendung von Policies

Page 26: ASP.NET Core Security

Policy Autorisierung

Page 27: ASP.NET Core Security

Autorisierung mit Policies

• Eine Policy kann mehrere Requirements haben

• Alle Requirements in einer Policy müssen Succeeded sein

• Mehrere Handler pro Requirement möglich• Einer davon muss Succeeden

• Jeder Requirement Handler kann Policy direkt auf Failed setzen

Page 28: ASP.NET Core Security

Resourcen Autorisierung

Page 29: ASP.NET Core Security

Resource RequirementHandler

Page 30: ASP.NET Core Security

Autorisierung mit Resourcen

• Via AuthorizationRequirementHandler • oder Policy• Resource-Property im HandlerContext

• OperationAuthorizationRequirment oder eigenes

Page 31: ASP.NET Core Security

DataProtection

• Datenschnipsel• z.B. Cookies, Bestätigungscode, Nachrichten• Früher war der MachineKey• Der war immer gleich für die Lebenszeit der Anwendung• Stand oft in der web.config für einfaches Deployment• Wieder von Katana inspiriert ;)

Page 32: ASP.NET Core Security

IDataProtectionProvider

• protectionProvider.CreateProtector(string purpose)

• protector.Protect()

• protector.Unprotect()

• protector.CreateProtector()

Page 33: ASP.NET Core Security

DataProtectionProvider

• Nötig wegen Plattform unabhängigkeit• Zentraler Keystore je nach Plattform• Automatischer KeyExchange alle 90 Tage• Automatische Entschlüsselung bei noch vorhandenen Keys• Bei abgelaufen Keys muss man „manuell“ ran.• Hierarchie möglich• Jede Anwendung = eigenen Ebene (aber überschreibbar)

Page 34: ASP.NET Core Security

Secrets

• Zugangsdaten

• ConnectionStrings• ClientId, ClientSecrets• Username, Password• usw.

• Haben nichts im Quelltext verloren

Page 35: ASP.NET Core Security

User Secrets verwenden

Startup.cs project.json

%APPDATA%\Microsoft\UserSecrets\{userSecretsId}\secrets.json~/.microsoft/usersecrets/{userSecretsId}/secrets.json

UserSecretsIdAttribute

(ab 1.1, 1.0.1 der Tools)

Page 36: ASP.NET Core Security

Secret Manager

CLI• dotnet user-secrets

• dotnet restorenicht vergessen

Commands• list• set• remove• clear

Page 37: ASP.NET Core Security

Cookie Policy

• Cookie Defaults für alle Cookies• HttpOnly und Secure, sehr einfach• CallBacks für weitere Einstellungen

• Nuget: Microsoft.AspNetCore.CookiePolicy

Page 38: ASP.NET Core Security

View Controller gegen CSRF absichern

• ValidateAntiforgeryTokenAttribute• POST, PUT etc. manuell und einzeln absichern

• AutoValidateAntiforgeryTokenAttribute• Alles aus GET, HEAD und OPTIONS• Zur Basic Klasse hinzufügen• oder Globaler Filter

• @Html.AntiForgeryToken() innerhalb des Formulars

Page 39: ASP.NET Core Security

Site API Controller gegen CSRF absichern

• Notwendig wenn man Cookie Authentication hat• Dasselbe Token im HTTP Header oder Query String

mitschicken.• Dem System den Header bekannt machen• Auch bei GET und Co mitsenden• ValidateAntiForgeryAttribute verwenden

Page 40: ASP.NET Core Security

Site API sollen 401, 403 senden

• Bei Cookie Authentication• man wir normalerweise redirected• AJAX Request sollten HTTP Header setzen

• X-Requested-With = XMLHttpRequest

• Dann wird 401 und 403 anstatt 302 gesendet• Location-Header beinhaltet weiterhin die Redirect Url