Laden...

ASP.NET Windows Authentifizierung, auf Rollen/Windows Gruppen zugreifen

Erstellt von mygil vor 12 Jahren Letzter Beitrag vor 12 Jahren 8.883 Views
M
mygil Themenstarter:in
124 Beiträge seit 2009
vor 12 Jahren
ASP.NET Windows Authentifizierung, auf Rollen/Windows Gruppen zugreifen

Hallo Leute!

Ich schlage mich gerade durch die ASP.NET Authentifizierungs-Welt durch.
"Forms" Authentifizierung klappte schon mal bestens...
Jedoch bei der "Windows" Authentifizierung habe ich jedoch noch Schwierigkeiten!
Die Anmeldung selbst scheint bestens zu klappen zumindest wird in meiner Silverlight-BusinessApplication der korrekte Benutzer angezeigt:(DomainName\UserName).

Mein Problem ist, dass der angemeldete Benutzer keine Rollen besitzt:


            foreach (string szRolle in WebContext.Current.User.Roles)
            {
                this.label1.Content += szRolle + " ";
            }

Soweit ich die Windows Authentifizierung richtig verstanden habe, dann lege ich doch eine ganz normale Windows-Gruppe am DomainController an und befülle diese mit z.b. meinem Windows Account. Diese müsste dann doch unter diesen WebContext.Current.User.Roles angezeigt werden oder?

Andere Beispiel:
Die folgende Einstellung (web.config) lässt mich anmelden:


    <authorization>
      <allow users="DOMAIN\MEINNAME" />
      <deny users="*" />
      <allow roles="DOMAIN\A_CMR_Bearbeiter" />
    </authorization>

Die folgende Einstellung (web.confgi) lässt mich nicht anmelden:


    <authorization>
      <deny users="*" />
      <allow roles="DOMAIN\A_CMR_Bearbeiter" />
    </authorization>

Obwohl ich in der Windows-Gruppe: DOMAIN\A_CMR_Bearbeiter vorkomme ...

Jemand eine Idee an was das liegt?

Danke!!

G
538 Beiträge seit 2008
vor 12 Jahren

Vielleicht trifft ja dieser Artikel (unable to use windows group as a role) auf dich zu.

Der Vorteil der Klugheit liegt darin, dass man sich dumm stellen kann - umgekehrt ist das schon schwieriger (K. Tucholsky)
Das Problem mit Internet-Zitaten ist, dass sie oftmals zu unrecht als authentisch angenommen werden. (K. Adenauer)

1.346 Beiträge seit 2008
vor 12 Jahren

vertausche mal das allow und das deny. ich könnte mir vorstellen, dass die Liste von oben nach unten abgearbeitet wird, und der erste Punkt der auf den Nutzer passt ist im zweiten Fall das deny, das ja für alle gilt.

16.841 Beiträge seit 2008
vor 12 Jahren

Korrekt, das deny ist hier an falscher Stelle.
Sofern Du MVC nutzt, solltest Du aber eigentlich besser auf das Authorize-Attribut statt nur auf die Config setzen.

Zudem sollte die Forms-Authentifizierung für diese Seite deaktiviert sein (im IIS), sofern man nur Windows (Kerberos/NTLM) nutzen will.

M
mygil Themenstarter:in
124 Beiträge seit 2009
vor 12 Jahren

Danke!

Der Zugriff funktioniert jetzt schonmal per AD-Gruppe hier meine Korrekturen:

  1. Reihenfolge geändert:

    <authorization>
      <allow roles="DOMAIN\A_CMR_Bearbeiter" />
      <deny users="*" />
    </authorization>

  1. RoleManager deaktiviert:

<roleManager enabled="false" />

  1. Ich habe mich am Windows-Rechner ab und wieder angemeldet.

Trotzdem bekomme ich keine Rollen in:


WebContext.Current.User.Roles

Und der folgende Befehl liefert mir auch FALSE:


WebContext.Current.User.IsInRole(@"DOMAIN\A_CMR_Bearbeiter").ToString()

Weiß jemand warum?

Noch eine Grundlegende Frage:
Wenn ich Windows-Authentifizierung nutze, brauche ich dann das folgende aktiviert:


  <connectionStrings>
    <add name="ApplicationServices" connectionString="Data Source=SERVER01;Initial Catalog=appservicesdb;Integrated Security=True" providerName="System.Data.SqlClient" />
  </connectionStrings>

  <system.webServer>
    <validation validateIntegratedModeConfiguration="false"/>
    <modules runAllManagedModulesForAllRequests="true">
      <add name="DomainServiceModule" preCondition="managedHandler"
          type="System.ServiceModel.DomainServices.Hosting.DomainServiceHttpModule, System.ServiceModel.DomainServices.Hosting, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
    </modules>
  </system.webServer>

Wenn ich das nämlich deaktiviere, dann funktioniert die Anmeldung überhaupt nicht mehr! Wird diese appservicesdb auch für die Windows-Authentifizierung benötigt? Oder hängt mein Problem damit zusammen, dass ich da irgendwas vermischt habe?! (Diese appservicesdb habe ich auf den Server: SERVER01 gelegt und klappte bestens für die Form-Authentifizierung)

Danke nochmal!

lg myGil

16.841 Beiträge seit 2008
vor 12 Jahren

Da ist definitiv was vermischt.

Für die Windows Authentifizierung brauchst Du keine Datenbank; außer Du benutzt noch einen ProfileProvider.
Und ein DomainServiceModule brauchst Du prinzipiell auch nicht.

Du musst im IIS nur die Authentifierzung auf Windows stellen, in der Web.Config

<authentication mode="Windows" />

in configuration > system.web eintragen; RoleManager deaktivieren, wenn die AD-Rollen verwendet werden sollen.

IsInRole() will meines Wissens auch nur den Rollennamen und kein Domain-Präfix. Konnte dazu auch in der Doku nichts finden.
Was sagt RolePrincipal Deines Users?

M
mygil Themenstarter:in
124 Beiträge seit 2009
vor 12 Jahren

Was meintest du mit:

in configuration > system.web eintragen

???

Das habe ich auf in die Web.config eingetragen:


<authentication mode="Windows" />

Am IIS habe ich unter IIS-Manager/WEBSERVER/Sites/Default WebSites/[Web-Andwendung]/Authentifizierung/ Alles deaktiviert bis auf "Windows-Authentifizierung"

Wenn ich alles deaktiviere wie du beschreibst dann bekomme ich folgende Fehlermeldung: (Siehe Bild im Anhang)

Hier mal meine Web.config:


<?xml version="1.0"?>
<configuration>
  <configSections>
    <sectionGroup name="system.serviceModel">
      <section name="domainServices" type="System.ServiceModel.DomainServices.Hosting.DomainServicesSection, System.ServiceModel.DomainServices.Hosting, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" allowDefinition="MachineToApplication" requirePermission="false" />
    </sectionGroup>
  </configSections>

  <connectionStrings>
    <!--<add name="ApplicationServices" connectionString="Data Source=TRCRYSTAL02;Initial Catalog=appservicesdb;Integrated Security=True" providerName="System.Data.SqlClient" />-->
  </connectionStrings>

  <system.web>
    <!--<httpModules>
      <add name="DomainServiceModule" type="System.ServiceModel.DomainServices.Hosting.DomainServiceHttpModule, System.ServiceModel.DomainServices.Hosting, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
    </httpModules>-->
    <compilation debug="true" targetFramework="4.0" />
    <globalization culture="auto" uiCulture="auto" />

    <!--<authentication mode="Forms">
      <forms name=".BusinessApplication1_ASPXAUTH" timeout="2880" />
    </authentication>-->

    <authentication mode="Windows">
    </authentication>

    <authorization>
      <allow roles="DOMAIN\A_CMR_Bearbeiter" />
      <deny users="*" />
    </authorization>

    <!--<membership>
      <providers>
        <clear/>
        <add name="AspNetSqlMembershipProvider" type="System.Web.Security.SqlMembershipProvider" connectionStringName="ApplicationServices"
             enablePasswordRetrieval="false" enablePasswordReset="true" requiresQuestionAndAnswer="false" requiresUniqueEmail="false"
             maxInvalidPasswordAttempts="5" minRequiredPasswordLength="6" minRequiredNonalphanumericCharacters="0" passwordAttemptWindow="10"
             applicationName="/" />
      </providers>
    </membership>-->

    <roleManager enabled="false" />

    <!--<roleManager enabled="true">
      <providers>
        <clear/>
        <add name="AspNetSqlRoleProvider" type="System.Web.Security.SqlRoleProvider" connectionStringName="ApplicationServices" applicationName="/" />
        <add name="AspNetWindowsTokenRoleProvider" type="System.Web.Security.WindowsTokenRoleProvider" applicationName="/" />
      </providers>
    </roleManager-->

    <!--<profile>
      <providers>
        <clear/>
        <add name="AspNetSqlProfileProvider" type="System.Web.Profile.SqlProfileProvider" connectionStringName="ApplicationServices" applicationName="/"/>
      </providers>
      <properties>
        <add name="FriendlyName"/>
      </properties>
    </profile>-->

  </system.web>

  <system.webServer>
    <!--<validation validateIntegratedModeConfiguration="false"/>
    <modules runAllManagedModulesForAllRequests="true">
      <add name="DomainServiceModule" preCondition="managedHandler"
          type="System.ServiceModel.DomainServices.Hosting.DomainServiceHttpModule, System.ServiceModel.DomainServices.Hosting, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
    </modules>-->
  </system.webServer>

  <system.serviceModel>
    <!--<serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" />-->
  </system.serviceModel>
</configuration>


Danke!!!

16.841 Beiträge seit 2008
vor 12 Jahren

Ja, das passt dann so mit der Authentication-Node. Die muss unter System.Web wie Du es hast.

Finde Deinen Fehler sehr merkwürdig.
Schau mal “Argument: NotFound” error using Windows Authentication for Silverlight an.

Bist Du Dir sicher, dass Deine Security Settings im IIS stimmen?
Schau auch die Standard-Einstellungen und die des aktuellen Application Pools an.

Nimm auch mal das Domain\ aus den Rollen und sectionGroup name="system.serviceModel" raus.
Evtl. will der nen DomainRequest absenden, sobald eine Domäne in der Gruppe erkannt wird.
Starte auch mal den Webserver neu; nich, dass sich da noch was im Cache befindet.
Wer gibt die Fehlermeldung aus? IIS oder ASP Development Server?

M
mygil Themenstarter:in
124 Beiträge seit 2009
vor 12 Jahren

Finde Deinen Fehler sehr merkwürdig.
Schau mal “Argument: NotFound” error using Windows Authentication for Silverlight an.

Habe ich soeben alles durchgemacht, aber noch das gleiche Problem.

Bist Du Dir sicher, dass Deine Security Settings im IIS stimmen?

Nein!

Die einzigen Einstellungen die ich nach der Installation von Microsoft Windows Server 2008 R2 vorgenommen habe sind:

  • Webdeploy installiert (Fein für das "Veröffentlichen" von VS2010 aus)
  • Die Windows Server 2008 R2 Rolle: "Windows-Authentifizierung" installiert
  • Anwendung "Veröffentlicht"
  • IIS/Sites/DefaultWebSite/[Website]: "In Anwendung konvertieren"
  • IIS/Sites/DefaultWebSite/Standarddokument: BusinessApplication2TestPage.aspx hinzugefügt (Damit das Teil auf geht)
  • IIS/Sites/DefaultWebSite/[Website]/IIS/Authentifizierung: "Windows-Authentifizierung" aktiviert und rest deaktiviert
  • IIS/Anwendungspools/DefaultAppPool/Erweiterte Einstellungen/Identität/LocalSystem gestellt (oder zuletzt hatte ich einen Administrator Benutzer darin stehen ...)
  • IIS/Sites/[Web-Anwendung]/Erweiterte Einstellungen/Anwendungspool = DefaultAppPool

Schau auch die Standard-Einstellungen

Was meinst du damit?
Falls du IIS/Sites/[Web-Anwendung]/Grundeinstellungen... meinst - dort habe ich nichts verändert:
Anwendungspool: DefaultAppPool
Physikalischer Pfad: %SystemDrive%\inetpub\wwwroot\DERNAME
Verbinden als...: Anwendungsbenutzer (Pass-Throug-Authentifizeriung)
Einstellung Testen ergibt: Fehler beim Ausführen dieses Vorgangs. Details Ungültiger Anwendungspfad
-> Dort habe ich jetzt soeben einen Domainen-Admin eingetragen und Einstellungen Testen ergibt jetzt: Authentifizierung OK und Autorisierung OK
Habe aber trotzdem nach wie vor das gleiche PRoblem.

Nimm auch mal das Domain\ aus den Rollen und sectionGroup name="system.serviceModel" raus.
Evtl. will der nen DomainRequest absenden, sobald eine Domäne in der Gruppe erkannt wird.
Starte auch mal den Webserver neu; nich, dass sich da noch was im Cache befindet.

Beides entfernt und den IIS starte ich sowieso wie verrückt neu.

Mir ist gerade aufgefallen: Diese Fehlermeldung bekomme ich nicht nur am IIS sondern auch auf meinem Arbeitsplatz wo ich die Anwendung entwickle...

Habe mal gedebuggt:

WebContext.Current.Authentication.LoadUser()

Das lässt sich einmal ausführen. Mein:

WebContext.Current.User

bleibt aber dadurch nach wie vor auf null und wenn ich jetzt nochmals:

WebContext.Current.Authentication.LoadUser()

Bekomme ich die Exception: "User Service-Vorgang wird bereits ausgeführt."
Also das endet nie wirklich richtig ...

Was habe ich noch alles gemacht:
In der Silverlight Anwendung selbst habe ich im Client Bereich von Form aus Windows geändert:


            //webContext.Authentication = new FormsAuthentication();
            webContext.Authentication = new WindowsAuthentication();

Und im Web-Bereich achte ich darauf, dass die beiden folgenden Verweise auf Lokale Kopie gestellt sind:
* System.ServiceModel.DomainServices.Hosting
* System.ServiceModel.DomainServices.Server

Ansonsten habe ich nichts gemacht! Event. fehlt doch noch eine Setting?!
(Habe gerade ein neues Projekt - genau nach dieser Anleitung gemacht - selbe Problem)

16.841 Beiträge seit 2008
vor 12 Jahren

Okay. Vielleicht ist das Silverlight spezifisch, dass man ein ServiceModel braucht; da kenn ich mich nun nicht aus. ASP an sich braucht das nicht.

Lass die Anwendung unter einem eigenen Application Pool laufen und mit einem eigenen User. Aber doch NIEMALS als Admin und schon fünf mal nicht als Domänen-Admin!!!

Bezüglich dem Fehler hab ich nun spontan keine Idee mehr.

M
mygil Themenstarter:in
124 Beiträge seit 2009
vor 12 Jahren

Aber doch NIEMALS als Admin und schon fünf mal nicht als Domänen-Admin!!!

War ja nur ein Test um alle Berechtigungs-Probleme auszuschließen ...

Ich test mal fröhlich weiter ...

Danke trotzdem!!!

M
mygil Themenstarter:in
124 Beiträge seit 2009
vor 12 Jahren

Kann es sein, dass diese DB doch gebraucht wird?

Wenn ich das extrem einfache Beispiel:
Exemplarische Vorgehensweise: Verwenden der Silverlight-Geschäftsanwendungsvorlage
durchlaufe - klappt alles bestens. Aber es wird darin nicht erwähnt, dass ich die ganzen DAtenbank etc. deaktivieren muss?!

lg myGil

16.841 Beiträge seit 2008
vor 12 Jahren

Vielleicht nutzt Silverlight er die Datenbank für irgendetwas; was aber aus ASP sicht nicht gebraucht wird.
Da Du aber von ASP Auth geschrieben hattest, bin ich auch davon ausgegangen; wenn das nun mit ASP eigentlich gar nichts zutun hat, sondern Du eigentlich nur die Authentifizierungsmöglichkeiten des Webservers nutzen willst, und Silverlight hier was eigenes / eigenartiges hast, kann das vielleicht sein.

Aber dann sollte man das oben etwas anders formulieren 😉