2012-12-04 21 views
5

Mam następującą konfigurację testową, wszystkich pracujących:Roles.IsUserInRole() nie działa w WCF przy użyciu wsHttpBinding i MVC 4

-WCF Zastosowanie prowadzenie MathService.svc, konfiguracja używać SimpleMembershipProvider

-MVC 4 Internet App użyciu domyślnego SimpleMembershipProvider

-Membership jest:

  • 3 Role: 'Debug', 'Administrator' i 'Edytor'
  • 2 użytkowników: 'Debug' w Debug rola i Administratora (ya, debugowanie użytkownik w roli debugowania)
  • 'admin' w Administrator Role

-Certificates, o ile mogę powiedzieć, pracuje, ja można połączyć się z usługą za pomocą wshttp

Kod metody usługi.

//[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")); 
    } 
} 

Dlaczego rozmowy do 'Roles.GetRolesForUser (cltName)' i isUserInRole braku?

Otrzymuję poprawną nazwę użytkownika z "ServiceSecurityContext", Jeśli włączę atrybut [PrincipalPermission], otrzymam odrzucenie, jeśli zadzwonię do usługi z administratorem, zgodnie z oczekiwaniami.

Dlaczego więc funkcja PrincipalPermission może uzyskać prawidłową rolę użytkownika? Dlaczego można użyć Roles.GetUsersInRole ("Debug"), aby uzyskać wszystkich poprawnych użytkowników , ale nie mogę wywołać Roles.IsUserInRole (..)?

Istnieje kilka wpisów sugerujących błędy konfiguracji certyfikatu// członkostwa, ale nie widzę, jak mogę uzyskać tak daleko i nadal mają błędną konfigurację, a przede wszystkim, tylko niektóre z metod Role zawodzą, nie wszystkie. Jakieś wskazówki?

słowo o wyniku powrotnego, jeżeli używam obejścia rola i wywołać poprzez Debug, usługa zwraca podwójnej precyzji, jeśli zadzwonię do administratora [PrincipalPermission] niepełnosprawnych, mam całkowitą precyzja powrotem

Pozdrowienia, Andreas

+0

może ona pomaga: http://msdn.microsoft.com/en-us/library/ff648163.aspx –

+0

Śledziłem że przykład konfigurowania wsHTTP i tak, używają tego, co nazywają "imperatywnymi kontrolami roli" i Roles.IsUserInRole(). Ale używają również domyślnego dostawcy roli członkostwa ASP.NET. Używam MVC 4 i nowego dostawcy SimpleMembership. Nie ma nic w łączu, które mogę znaleźć na temat dlaczego ta konkretna metoda NIE działa – Andreas

Odpowiedz

4

Na wszelki wypadek, jeśli ktoś napotka na ten sam problem.

Chociaż można używać "starego" RoleProvider ASP.net z SimpleMembership, nie są one takie same.

W moim przypadku musiałem dodać prostą obsadę.

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

i wtedy działa

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

W moim przypadku musiałem napisać 'Roles.Provider.IsUserInRole()' zamiast 'Roles.IsUserInRole (...)'. – Simon