Windows-Authentifizierung mit Active Directory-Gruppen
Ich habe ein kleines Projekt, erstellt mit Visual Studio 2013, .NET 4.5, MVC 5 und EF-6. Ich habe es mithilfe der Windows-Authentifizierung, aber jetzt brauche ich, um zu überprüfen, für die Mitgliedschaft in einer Active Directory Gruppe erlauben oder verweigern den Zugang.
Ich gegangen bin, viele SEHR tief Kaninchen Löcher, die versuchen, um herauszufinden, wie dies zu tun. Zuerst ging ich davon aus, dass ich ändern müssen, das Projekt "On-Premises" - Authentifizierung. Ich habe jedoch festgestellt, dass:
- Es anscheinend nicht möglich ist, in VS 2013, ändern Sie den Typ der Authentifizierung, die ein Projekt verwendet (außer manuell Bearbeiten einiger Dateien).
- Es gibt keine Dokumentation noch erklären, wie das setup "On-Premises" - Authentifizierung. (Wirklich? Wie ist das möglich?)
- Auf jeden Fall, was ich brauchen, ist nicht "On-Premises" - Authentifizierung, da diese nur für Windows Identity Federation services (oder so ähnlich). Was sollte ich verwenden, stattdessen ist nur die Windows-Authentifizierung mit ASP.Net Rollen, die Windows scheinbar bekommt von Active Directory-Gruppen, wenn ich login.
So, unter der Annahme, dass #3 wahr ist, ich habe versucht, das Lesen der zahlreichen Beiträge dazu, aber Sie scheinen, fallen in zwei grundlegende Gruppen:
- Unkomplizierte, einfache Methoden, die ich nicht auf der Arbeit, wahrscheinlich, weil Sie davon ausgegangen, einige wissen, dass ich nicht zu haben.
- Komplexe, benutzerdefinierte-codierte Methoden, die ich vermute, sind dabei durch code-was wohl getan werden in einen code-free-Methode.
Unter der Annahme, dass #1 ist der Weg zu gehen, hier meine letzten Versuch.
In meinem controller habe ich:
[Authorize(Roles=@"SomeDomain\\SomeGroup")]
public class SomeController : Controller
In meinem Web.config-Datei, die ich habe:
<system.web>
<authentication mode="Windows" />
<authorization>
<deny users="?" />
</authorization>
<roleManager enabled="true" defaultProvider="AspNetWindowsTokenRoleProvider">
<providers>
<clear/>
<add name="AspNetWindowsTokenRoleProvider"
type="System.Web.Security.WindowsTokenRoleProvider"
applicationName="/" />
</providers>
</roleManager>
</system.web>
<system.serviceModel>
<behaviors>
<serviceBehaviors>
<behavior name="BehaviorConfiguration">
<serviceAuthorization
principalPermissionMode="UseAspNetRoles"
roleProviderName="AspNetWindowsTokenRoleProvider" />
<serviceMetadata />
</behavior>
</serviceBehaviors>
</behaviors>
</system.serviceModel>
Wenn ich versuche auf die Seite zuzugreifen, bin ich stattdessen dazu aufgefordert, mich einzuloggen. Nach der Eingabe meiner login-ID und Passwort, die ich erhalten weiterhin die login-Eingabeaufforderung. Ich bin nicht berechtigt, die Seite.
Ich habe nicht alles überall sagen, meine Anwendung, in denen der Active Directory-server ist, aber der Eindruck, den ich bekomme ist, dass Windows bereits kennt, weiß, dass (da, wenn ich die Anmeldung an Windows, es greift auf das Active Directory-server zu authentifizieren mir).
Bin ich etwas fehlt? Oder bin ich da falsch in der Annahme, dass dies getan werden kann, ohne benutzerdefinierten code schreiben zu müssen?
Caveat: ich bin Recht neu auf .NET, MVC, etc, kommen aus der Java-Welt, so nutzen Sie bitte kleine Worte. 🙂
Hatte ich sah, dass der post von vorhin, und basiert vieles von dem, was ich versuchte, aber es funktionierte nicht. Ich habe jetzt herausgefunden, was ich falsch gemacht habe, aber. In dem Attribut, das in meinem controller habe, hatte ich 2 backslashes zwischen den Namen der Domäne und den Namen der Rolle, anstatt einer. Also ich hatte:
[Authorize(Roles=@"SomeDomain\\SomeGroup")]
statt [Authorize(Roles=@"SomeDomain\SomeGroup")]
Doh!InformationsquelleAutor Wally Hartshorn | 2014-02-11
Du musst angemeldet sein, um einen Kommentar abzugeben.
Habe das problem gefunden. Was hatte ich oben war richtig, außer ich hatte ZWEI Schrägstriche zwischen Domäne Namen und den Namen der Rolle ein, statt einer. Der fix war einfach ändern auf dieser:
@
vor jeder string-literal bedeutet "nehmen Sie diese Zeichenfolge wird genau wie geschrieben, ohne dem backslash-symbol irgendwelche besonderen Kräfte, die als escape-symbol für control-codes". Eine alternative ist, fallen die@
vor dem string, und dann verdopple deinen backslashes, da jede \\ würde dann interpretiert werden als ein einzelnes literal \. Dieser ist es, für C-style-control-codes z.B.\r\n\t
etc. Gut gemacht für die Lösung Ihres eigenen Problems aber!InformationsquelleAutor Wally Hartshorn
Können Sie auch einen filter in RegisterGlobalFilters in der App_Start-Ordner.
InformationsquelleAutor Steve Paul