C# を使用して、.Net 4.5 に WCF Web サービスがあります。認証に PrincipalPermission を使用しようとしていますが、常に認証チェックに失敗していました。そのため、デバッグのために Roles.IsUserInRole("SystemAdministrator") の呼び出しに切り替えました。Roles.IsUserInRole は常に false を返します。プリンシパルは AuthorizationManager クラスに設定されています。
protected override bool CheckAccessCore(OperationContext operationContext)
{
...
if (! MembershipProvider.ValidateUser(credentials.UserName, credentials.Password))
{
return false;
}
var user = MembershipProvider.GetUser(credentials.UserName, true);
var claims = new List<Claim>().InjectInstanceClaims()
.InjectUserClaims(user)
.InjectAuthenticationClaims("CustomAuth");
var roles = RolesProvider.GetRolesForUser(user.Name);
foreach (var role in roles)
{
claims.Add(new Claim(ClaimTypes.Role, role));
}
var authenticatedUser = new ClaimsPrincipal(new ClaimsIdentity(claims, "CustomAuth"));
Thread.CurrentPrincipal = authenticatedUser;
return user.IsApproved && ! user.IsLockedOut;
}
次に、AuthorizationPolicy で、evaluationContext.Properties["Principal"] を Thread.CurrentPrincipal に設定します。
public class AuthorizationPolicy : IAuthorizationPolicy
{
public AuthorizationPolicy ()
{
Id = Guid.NewGuid().ToString("N");
}
public string Id { get; private set;
}
public bool Evaluate(EvaluationContext evaluationContext, ref object state)
{
evaluationContext.Properties["Principal"] = Thread.CurrentPrincipal;
return true;
}
public ClaimSet Issuer
{
get { return ClaimSet.System; }
}
}
WCF メソッドに到達すると、上記で作成したユーザーがあり、Identity.Claims に ClaimTypes.Role / "SystemAdministrator" のクレームがあることをデバッガーで確認できますが、IsUserInRole への呼び出しは常に間違い。
public IEnumerable<Credentials> GetAllCredentials()
{
if (!Roles.IsUserInRole("SystemAdministrator"))
{
throw new HttpException(401, "Not authorized");
}
return CredentialData.GetAll();
}
カスタム AuthorizationManager とカスタム AuthorizationPolicy で Roles.IsUserInRole が true を返すようにするにはどうすればよいですか?