2014-02-07 9 views
7

Szenario: WCF-Dienst mit SqlRoleProvider für die Authentifizierung mit einem Sql Server 2012-Datenbankserver. WCF wird auf einem IIS7-Webserver gehostet.SqlRoleProvider: NullReferenceException beim Aufrufen von Roles.GetRolesForUser

sehen Sie bitte diesen Fehler:

System.NullReferenceException: Object reference not set to an instance of an object.
at System.Web.Security.Roles.GetRolesForUser(String username)

RoleManagement aktiviert ist.

Auf meiner lokalen Entwicklungsmaschine (Server 2012, iis7) funktioniert das gut. Wenn ich mich anmelde und die Methode anrufe, werden die Rollen abgerufen.

Auf dem anderen Server (Testumgebung) funktioniert es nicht. Ich kann mich anmelden (der Benutzer wird mit dem Benutzer authentifiziert und an die SQL Server-Datenbank übergeben), aber wenn ich versuche, die Rollen für diesen Benutzer abzurufen, erhalte ich eine Nullreferenz-Ausnahme.

Wie ist das möglich, hat jemand irgendwelche Hinweise darauf, wo dieses Problem auftreten könnte?

Mit freundlichen Grüßen.

Antwort

14

blergh

mit den Tags googeln Stackoverflow bereitgestellt I-Code über eingeben hergekommen Diese Website durchsuchen: http://www.lhotka.net/weblog/CallingRolesGetRolesForUserInAWCFService.aspx

Kurz: anscheinend etwas brach zwischen .net 3.5 und .net 4.

Um dieses Problem zu lösen, rufen Sie an:

string[] roles = Roles.Provider.GetRolesForUser(ServiceSecurityContext.Current.PrimaryIdentity.Name); 

statt

string[] roles = Roles.GetRolesForUser(ServiceSecurityContext.Current.PrimaryIdentity.Name); 

Der Unterschied liegt in der .Provider, die in der Mitte hinzugefügt wird. Nach dem Hinzufügen hat es gut funktioniert.

+1

Das jetzt funktioniert für mich, aber ich hatte auch alle Vorkommen der Anrufe auf „IsUserInRole()“ auch anzupassen. Seltsamerweise wird der Fix nur benötigt, wenn die Lösung mit VS2013 gestartet wird. Wenn VS2010 auf derselben Maschine gestartet wird, funktionieren die Anrufe ohne die Änderung. Zu Ihrer Information, ich habe ein .NET 3.5 WCF-Projekt, wenn das wichtig ist. – Marcel

+0

Ich hatte das gleiche genaue Problem. Ich habe folgende Zeilen in Web.config zu Benutzer Roles.GetRolesForUser hinzugefügt, andernfalls müssen Sie den Benutzer Roles.Provider.GetRolesForUser verwenden. Ich verwende MVC5 mit OWIN Middleware aktiviert. user357086

1

Dieses Problem klingt wie dieser asp.net Bug.

connect.microsoft.com

Eine Abhilfe ist Ihr Webserver Tracing Pegel einzustellen. Zum Beispiel das Hinzufügen der Folge Einstellungen in der web.config-Datei würde das Problem beheben,

<system.webServer> 
    <tracing> 
    <traceFailedRequests> 
     <remove path="*"/> 
     <add path="*"> 
     <traceAreas> 
      <add provider="ASP" verbosity="Verbose" /> 
      <!-- Note that the verbosity is set to Warning (default value is Verbose)--> 
      <add provider="ASPNET" areas="Infrastructure,Module,Page,AppServices" verbosity="Warning" /> 
      <add provider="ISAPI Extension" verbosity="Verbose" /> 
      <add provider="WWW Server" areas="Authentication,Security,Filter,StaticFile,CGI,Compression,Cache,RequestNotifications,Module,Rewrite,WebSocket" verbosity="Verbose" /> 
     </traceAreas> 
     <failureDefinitions statusCodes="200-999" /> 
     </add> 
    </traceFailedRequests> 
    </tracing> 
</system.webServer> 
Verwandte Themen