I have the following test setup, all working:
-WCF Application running a MathService.svc, setup to use SimpleMembershipProvider
-MVC 4 Internet App using the default SimpleMembershipProvider
-Membership is:
-Certificates, as far as I can tell are working, I can connect to the service using wshttp
Service Method Code.
//[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"));
}
}
Why are calls to' Roles.GetRolesForUser(cltName)' and IsUserInRole failing?
I get the correct username from 'ServiceSecurityContext', If I enable the [PrincipalPermission] attrib I get rejected if I call the service with user Admin, as expected.
So why would PrincipalPermission be able to get the correct user role? Why can I use Roles.GetUsersInRole("Debug") to get all correct users BUT I can not call Roles.IsUserInRole(..)??
There are some posts suggesting certificate / /membership setup errors, but I can not see how I can get so far and still have a wrong setup, and above all, just SOME of the Roles methods fail, not all. Any pointers?
A word about the return result, If I use my Role workaround and call via Debug, the service returns double precision, if I call with admin [PrincipalPermission] disabled, I get integer precision back
Regards, Andreas
Just in case anyone runs into the same problem.
While you can use the 'old' ASP.net RolesProvider with simpleMembership, they are not the same.
In my case, I had to add a simple cast.
var _simpleRoles = (SimpleRoleProvider)Roles.Provider; //need the cast to simple
and then this works
var b = simpleRoles.IsUserInRole(cltName, "Debug");
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With