2012-12-04 16 views
5

Ho la seguente configurazione di prova, tutto lavoro:Roles.IsUserInRole() non funziona in WCF utilizzando wsHttpBinding e MVC 4

-WCF applicazione l'esecuzione di un MathService.svc, messa a punto da usare SimpleMembershipProvider

-MVC 4 Internet App utilizzando il default SimpleMembershipProvider

-Membership è:

  • 3 ruoli: 'debug', 'amministratore' e 'Editor'
  • 2 gli utenti: 'Debug' in Debug Ruolo e Amministratore (ya, il debug utente in ruolo di debug)
  • 'Admin' nel ruolo di amministratore

-Certificates, per quanto posso dire stanno lavorando, io può connettersi al servizio utilizzando wshttp

Codice metodo di servizio.

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

Perché sono chiamate a 'Roles.GetRolesForUser (cltName)' e IsUserInRole fallendo?

Ottengo il nome utente corretto da "ServiceSecurityContext", Se abilito l'attributo [PrincipalPermission], viene rifiutato se chiamo il servizio con l'utente Admin, come previsto.

Quindi perché PrincipalPermission è in grado di ottenere il ruolo utente corretto? Perché posso utilizzare Roles.GetUsersInRole ("Debug") per ottenere tutti gli utenti corretti MA Non riesco a chiamare Roles.IsUserInRole (..) ??

Ci sono alcuni post che suggeriscono errori di configurazione di certificati// membri, ma non riesco a vedere come posso arrivare così lontano e avere ancora una configurazione sbagliata, e soprattutto, solo alcuni dei metodi dei ruoli falliscono, non tutti. Qualche indicazione?

Una parola per il risultato di ritorno, se uso il mio soluzione Ruolo e chiamare tramite Debug, il servizio restituisce doppia precisione, se chiamo con admin [PrincipalPermission] disabili, ottengo intero precisione indietro

saluti, Andreas

+0

essa può aiuta: http://msdn.microsoft.com/en-us/library/ff648163.aspx –

+0

Ho seguito questo esempio la creazione di wsHTTP, e sì, usano quello che chiamano "controlli dei ruoli imperativi" e Roles.IsUserInRole(). Ma usano anche il provider di ruolo Membership ASP.NET predefinito. Io uso MVC 4 e il nuovo provider SimpleMembership. Non c'è nulla nel link che riesco a trovare sul perché questo metodo specifico NON funziona – Andreas

risposta

4

Nel caso in cui qualcuno si imbatta nello stesso problema.

Sebbene sia possibile utilizzare il 'vecchio' ASP.net RolesProvider con simpleMembership, non sono la stessa cosa.

Nel mio caso, ho dovuto aggiungere un semplice cast.

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

e quindi questo funziona

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

Nel mio caso dovevo scrivere 'Roles.Provider.IsUserInRole()' invece di 'Roles.IsUserInRole (...)'. – Simon