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!!
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)
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.
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.
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
Danke!
Der Zugriff funktioniert jetzt schonmal per AD-Gruppe hier meine Korrekturen:
<authorization>
<allow roles="DOMAIN\A_CMR_Bearbeiter" />
<deny users="*" />
</authorization>
<roleManager enabled="false" />
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
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?
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
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!!!
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?
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
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:
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)
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.
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
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!!!
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
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 😉
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code