2012-12-04 21 views
5

Ich habe folgenden Testaufbau, alle Arbeiten:Roles.IsUserInRole() funktioniert nicht in WCF mit wsHttpBinding und MVC 4

-WCF Anwendung eine MathService.svc ausgeführt wird, Setup SimpleMembershipProvider verwenden

-MVC 4 Internet App mit dem Standard-SimpleMembershipProvider

-Mitgliedschaft ist:

  • 3 Rollen: 'Debug', 'Administrator' und 'Editor'
  • 2 Benutzer: 'Debug' in Rollen Debug und Administrator (ya, Benutzer Debug in Rolle debug)
  • 'Admin' in Role Administrator

-Zertifikate, soweit ich arbeiten kann sagen, ich Kann mit dem Service unter Verwendung von Wshttp

Service-Methode Code verbinden.

//[PrincipalPermission(SecurityAction.Demand, Role = "Debug")] 
public string Add(double A, double B) 
{ 
    OperationContext oc = OperationContext.Current; 
    ServiceSecurityContext ssc = oc.ServiceSecurityContext; 
    string cltName = ssc.PrimaryIdentity.Name; //cltName = "Debug" 
    var Rs = Roles.GetAllRoles(); //returns: 'Debug', 'Administrator', 'Editor' => OK 
    var dUsers = Roles.GetUsersInRole("Debug"); // 'Debug' => Expected 
    var aUsers = Roles.GetUsersInRole("Administrator"); // 'Debug', 'Admin' => expected 
    try 
    { 
     var a = Roles.GetRolesForUser(cltName); //this fails 
     var b = Roles.IsUserInRole(cltName, "Debug"); //this fails 
     var c = Roles.IsUserInRole(cltName, "Administrator"); //this fails 
    } 
    catch (Exception err) 
    { 
     string p = err.Message; // all fail with error : 
     // "Object reference not set to an instance of an object", inner exception=null 
    } 
    if (dUsers.Contains(cltName)) //this works, but requires extra step 
     //I should be able to us if(Roles.IsUserInRole(cltName, "Debug"))... here?!? 
    { 
     return string.Format("Result: {0}", (A + B).ToString("N2")); 
    } 
    else 
    { //this is just to get a different result if NOT in role 'Debug' 
     return string.Format("Result: {0}", ((int)A + (int)B).ToString("N2")); 
    } 
} 

Warum sind Anrufe zu 'Roles.GetRolesForUser (cltName)' und IsUserInRole versagt?

Ich bekomme den richtigen Benutzernamen von 'ServiceSecurityContext', Wenn ich die [PrincipalPermission] -Attrib aktivieren, werde ich abgelehnt, wenn ich den Dienst mit dem Benutzer Admin wie erwartet aufrufen.

Warum also PrincipalPermission in der Lage sein, die richtige Benutzerrolle zu bekommen? Warum kann ich Roles.GetUsersInRole ("Debug") verwenden, um alle korrekten Benutzer zu erhalten ABER ich kann Roles.IsUserInRole (..) nicht aufrufen ??

Es gibt einige Beiträge, die auf Zertifikats-// Mitgliedschaftseinstellungsfehler hinweisen, aber ich kann nicht sehen, wie ich so weit komme und immer noch ein falsches Setup habe, und vor allem scheitern einige der Rollen-Methoden, nicht alle. Irgendwelche Zeiger?

ein Wort über die Rückkehr Ergebnis Wenn ich meine Rolle Abhilfe verwenden und über Debug aufrufen, der Service mit doppelter Genauigkeit zurück, wenn ich mit Admin rufen [Principal] deaktiviert, erhalte ich integer Präzision

Grüße zurück, Andreas

+0

kann es hilft: http://msdn.microsoft.com/en-us/library/ff648163.aspx –

+0

Ich folgte dem Beispiel wsHTTP Einrichtung und Ja, sie verwenden das, was sie "imperative role checks" und Roles.IsUserInRole() nennen. Sie verwenden jedoch auch den Standardanbieter für die ASP.NET-Mitgliedschaftsrolle. Ich benutze MVC 4 und den neuen SimpleMembership Provider. Es gibt nichts in der Verbindung, die ich darüber finden kann, warum diese spezifische Methode NICHT funktioniert – Andreas

Antwort

4

Nur für den Fall, dass jemand in das gleiche Problem läuft.

Während Sie den 'alten' ASP.net RolesProvider mit simpleMembership verwenden können, sind sie nicht identisch.

In meinem Fall musste ich eine einfache Besetzung hinzufügen.

var _simpleRoles = (SimpleRoleProvider)Roles.Provider; //need the cast to simple 

und dann funktioniert die

var b = simpleRoles.IsUserInRole(cltName, "Debug"); 
+1

In meinem Fall musste ich 'Roles.Provider.IsUserInRole()' anstelle von 'Roles.IsUserInRole (...)' schreiben. – Simon