Laden...

Authentifizierung über AD Gruppen: Wo gibt man Rollen & User bzw Adressen dazu an?

Erstellt von MoMa91 vor 6 Jahren Letzter Beitrag vor 6 Jahren 2.821 Views
M
MoMa91 Themenstarter:in
49 Beiträge seit 2017
vor 6 Jahren
Authentifizierung über AD Gruppen: Wo gibt man Rollen & User bzw Adressen dazu an?

Guten Tag,

habe bei meinem ersten Projekt schon seit einer Woche ein Problem bei der Authentifizierung.
In der FA habe ich mich aus PW-Verwaltungsgründen bzw. komfortableren Login für eine Authentifizierung über Windows User entschieden.
Falls nicht alles sofort auf Anhieb verständlich ist sorry, mache das zum ersten mal, da ich gerade erst meinen Abschluss hatte.

Ich bin einem Tutorial gefolgt, was soweit ganz gut funktionierte und echt sehr verständlich war:
Using OWIN and Active Directory to authenticate users in ASP.Net MVC 5 application

Jedoch musste ich nirgends eine Domäne angeben, bzw. Servername. Dadurch funktioniert die Authentifizierung mit jedem
beliebigen Benutzer innerhalb des Netzes.

Außerdem soll es unterschiedliche Rollen (AD-Gruppen) geben und dazu gibt es ja bei der Annotation [Authorize], die
derzeit über jeden Controller steht, die möglichkeit einen Rolle anzugeben (=Name der AD-Gruppe).

Nun wäre meine Frage, was ich verändern muss (vermutlich in der Klasse AdAuthenticationService) um diese Rollen angeben zu können,
bzw. wo man hier den Servernamen angibt, in dem sich die AD-Gruppen befinden, denn ohne kann es doch garnicht funktionieren?

Wäre echt super wenn mir wer bei meinem Problem helfen könnte.
Falls es schon so ein Thema gibt sorry, jedoch denke ich, dass mir nur Beiträge speziell zu diesem Tutorial helfen.Using OWIN and Active Directory to authenticate users in ASP.Net MVC 5 application

D
985 Beiträge seit 2014
vor 6 Jahren

Hast du dir den Source angeschaut?

github: AdAuthenticationService

6.911 Beiträge seit 2009
vor 6 Jahren

Hallo MoMa91,

es geht aus den Links indirekt hervor, aber welche welches Asp.net verwendest du? Basierend auf .net Core od. .net Full?

Danach unterscheidet sich auch (teilweise) die weitere Vorgehensweise.

Windows-Authentifierung lässt sich unter .net Full und .net Core bewerkstelligen.
Stell einfach einmal auf Windows-Authentication und schau was passiert.
Bei .net Core geht das allerdings nur beim IIS-Hosting, sonst muss das selbst bzw. durch andere Komponenten bewerkstelligt werden.

Jedoch musste ich nirgends eine Domäne angeben, bzw. Servername. Dadurch funktioniert die Authentifizierung mit jedem beliebigen Benutzer innerhalb des Netzes.

Servername kommt von der Domäne zu welcher der Webserver beigetreten ist.
Domäne gibt der der User doch bei der Anmeldung mit an (wenn auch implizit wie im IE).

BTW: hast du auf dem von dir verlinkten Blog den Folgebeitrag gar nicht gesehen? Active Directory Authentication with OWIN in MVC5. Part 2: Roles and Corrections

mfG Gü

Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.

"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"

M
MoMa91 Themenstarter:in
49 Beiträge seit 2017
vor 6 Jahren

hallo und mal danke für die schnelle Rückmeldung.

sofern ich alles richtig verstanden habe.

Die Domäne wird durch den IIS bestimmt und verglichen mit der Domäne, die bei der Anmeldung angegeben wird. Deshalb funktioniert es derweil mit allen möglichen Usern der Firma.
Deshalb muss das auch nirgends explizit angegeben werden.

Diesen Beitrag habe ich wohl wirklich übersehen, jedoch ist damit eigentlich das Problem gelöst wenn ich es richtig verstanden habe, dass die Zeile:

var groups = userPrincipal.GetAuthorizationGroups();

alle AD-Gruppen zurückgibt und dafür dann in einer Schleife Claims anlegt. somit kann man dann über die AD-Gruppen-Namen die Rollen bestimmen, die Zugriff haben?

Habe in regedit nachgesehen und da gibt es einen Full Ordner, also verwende ich .NET Full wenn ich das richtig gegoogelt habe.

6.911 Beiträge seit 2009
vor 6 Jahren

Hallo MoMa91,

somit kann man dann über die AD-Gruppen-Namen die Rollen bestimmen, die Zugriff haben?

ja.

also verwende ich .NET Full wenn ich das richtig gegoogelt habe.

Naja, das hat du beim Anlegen des Projektes gewählt. Weil in der Registry ein passender Key ist heißt das ja nur dass .net Full installiert ist.

mfG Gü

Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.

"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"

M
MoMa91 Themenstarter:in
49 Beiträge seit 2017
vor 6 Jahren

Das werde ich am Montag gleich ausprobieren und dann funktioniert das hoffentlich und ich kann mit meiner Software produktiv gehen.

Danke vielmals für die großartige und schnelle Hilfe.

LG

M
MoMa91 Themenstarter:in
49 Beiträge seit 2017
vor 6 Jahren

Hallo,

bin noch auf ein Problem draufgekommen, dass es jedoch nur bei einem Benutzer gibt, die restlichen User können sich ohne Probleme einloggen.

und zwar bekomme ich da folgende Fehlermeldung beim Auflisten der Gruppen in der foreachschleife bei @Group:

Fehlermeldung:
NoMatchingPrincipalException was unhandled by user code

Additional Information: > Fehlermeldung:

Fehler beim Auflisten der Gruppen. Die Gruppe wurde nicht gefunden.

Mit jedem anderen Benutzer funktioniert das jedoch. Habt ihr vlt irgendeine Idee an was das liegen kann?

Ein weiterer Punkt der mir noch fehlt, betrifft zwar ein anderes Thema, aber habe mir gedacht ich frage das hier auch kurz. Es geht um die Absicherung von SQL Injections.

habe, da es die Datenbank schon gibt, das Verfahren DB First gewählt. Wähle somit Tabellen und Views aus, die ich benötige und es wird die .edmx-Datei erstellt. Benötige dabei keine Procedures. Verwende auch um auf die Daten zuzugreifen keine Execute SQL Commands usw... Beim googeln bin ich lediglich auf Beispiele gekommen mit Procedures bzw. solchen SQL Commands im Code.

Ich greife auf die Daten zu, indem ich oben im Controller einen Context anlege:

BeispielEntities db = new BeispielEntities();

dann weise ich in einer Action die Daten auf Collctions zu:

model.BeispielList = db.BeispielView; 

Ich meine Natürlich wird daraus auch ein SQL Code erstellt, muss ich mich aber hier noch gegen Injections absichern?

Danke im Voraus.

16.842 Beiträge seit 2008
vor 6 Jahren

NoMatchingPrincipalException wird geworfen, wenn es das Principal Object (zB ein Benutzer) mit den angegeben Parametern (zB Benutzername) im Provider (zB im AD) nicht gibt.

Deine Additional Information sagt aber ja eigentlich klar, dass die Gruppe nicht gefunden werden kann.

Bist Du wirklich noch mit ASP.NET 4.x unterwegs, oder schon mit ASP.NET Core (der aktuellen Fassung von ASP.NET)?
Hier ist die Handhabung der Pipelines, in die man Middlewares registriert (zB Authentication), anders.

PS: DB First gibt es in Zukunft auch nicht mehr.
EDMX-Files sind schon abgekündigt.

M
MoMa91 Themenstarter:in
49 Beiträge seit 2017
vor 6 Jahren

Was für mich nur komisch ist, dass es bei anderen Benutzern funktioniert und nur bei einem nicht, und das es die Gruppe, wenn ich das AD im Netzwerk durchsuche gibt?

Ja verwende ASP.NET 4.5.2
Muss dazusagen, dass das mein erstes Projekt ist und das die VS Version (2015) der Schule.

okey wie wird es dann umgesetzt? falls ich das mal umschreiben muss^^ gibt es da ein gutes Tutorial?

bzw. würde mich trotzdem interessieren, wie man sich hier mit SQL Injections absichert, da ich das für die Produktivsetzung brauche.

M
MoMa91 Themenstarter:in
49 Beiträge seit 2017
vor 6 Jahren

ok habe jetzt noch etwas im Netz gesucht und bin dazu gekommen, dass man bei LINQ to SQL sich nicht weiter absichern muss, da hier bim erstellen der Queries SQLParameter verwendet werden.

16.842 Beiträge seit 2008
vor 6 Jahren

Linq to SQL gilt als ORM und ORM sind so entwickelt, dass SQL Injection prinzipiell unterbunden wird.

M
MoMa91 Themenstarter:in
49 Beiträge seit 2017
vor 6 Jahren

Hallo, bei der Produktivsetzung ist mir noch was aufgefallen.

Bei der Anmeldung werden doch mit

var groups = userPrincipal.GetAuthorizationGroups(); 

die AD-Gruppen ausgelesen, aber da werden doch alle ausgelesen?

Jetzt habe ich die Methode

var groups = userPrincipal.GetGroups();

verwendet und die ist doch besser geeignet, da hier nicht alle Gruppen ausgelesen werden, sondern nur die, in der sich der User befindet. (auch zwecks IT-Security Aspekten). Habe ich recht?

D
985 Beiträge seit 2014
vor 6 Jahren

Hast du die Dokumentation zu den Methoden gelesen?

Wenn ja, dann wäre deine Frage schon beantwortet