I am trying to work out why attribute based security isn't working as I'd expect in WCF and I suspect it might have something to do with the following:
AppDomain.CurrentDomain.SetPrincipalPolicy(PrincipalPolicy.WindowsPrincipal);
var identity = new WindowsIdentity("ksarfo");
var principal = new WindowsPrincipal(identity);
Console.WriteLine("\nChecking whether current user [" + identity.Name + "] is member of [" + groupName + "]");
Console.WriteLine(principal.IsInRole(groupName)); // returns true
principal = (WindowsPrincipal)Thread.CurrentPrincipal;
identity = (WindowsIdentity) principal.Identity;
Console.WriteLine("\nChecking whether current user [" + identity.Name + "] is member of [" + groupName + "]");
Console.WriteLine(principal.IsInRole(groupName)); // returns false
I don't understand why the results differ for the function call:
principal.IsInRole(groupName)
For the sake of completeness the point at which the code actually fails is here:
PrincipalPermission(SecurityAction.Demand, Role = "PortfolioManager")]
Help appreciated.
I believe the difference is between the logged in user and the account running the app (thread). These will not always be the same.
Maybe it's because this is not the same classes.
Look at MSDN :
So, if there are differents classes, maybe there are differents implementations.
EDIT :
I have try this code :
And here is the result
As you can see, I did not have the same groups with differents ways. So (because I'm administrator of my local machine) I think that WindowsIdentity.GetCurrent will get the user from AD and WindowsPrincipal(WindowsIdentity("")) will get the user from local machine.
In my webapp, I have got the lowest authorisation possible (I think). But, I have no explanations for the consoleapp...
It's only suppositions, but this is coherent.
I admit it's a rather ugly workaround, but if all else fails you could replace:
with something like
If that doesn't work, it will probably at least be instructive in showing where things are going wrong.
But I can't imagine it failing, since it does exactly the same thing (where it is relevant) as the line that worked: I assume
Thread.CurrentPrincipal.Identity.Name
is"ksarfo"
.