Проверка разрешений утверждений завершается неудачно, когда ClaimsPrincipalPermission применяется к классу и методу в нем
У меня есть следующий класс:
[ClaimsPrincipalPermission(SecurityAction.Demand, Operation = "view", Resource = "agreement")]
public class AgreementViewModel : Screen
{
[ClaimsPrincipalPermission(SecurityAction.Assert, Operation = "save", Resource = "agreement")]
public async void Save()
{
}
}
Моя проблема в том, что, несмотря на то, что у принципала есть обе претензии, указанные выше, вызов Save не выполняется. Если я снимаю претензии с уровня класса, он работает нормально. Класс также инстанцирует просто отлично. Моя "ручная" проверка, чтобы выяснить, может ли пользователь выполнить действие, работает нормально, это фактическое выполнение, которое дает сбой. Ручная проверка определяется следующим образом:
public bool CanExecute(object sender, [CallerMemberName] string callerMethod = null)
{
string targetMethodName = callerMethod;
if (callerMethod == null)
return true;
if (callerMethod.StartsWith("Can"))
targetMethodName = callerMethod.Substring(3, callerMethod.Length - 3);
if (string.IsNullOrEmpty(targetMethodName))
return true;
var claimsAttribute = sender.GetType().GetMethods()
.Where(x => x.Name == targetMethodName)
.SelectMany(x => x.GetCustomAttributes(typeof(ClaimsPrincipalPermissionAttribute), true).Cast<ClaimsPrincipalPermissionAttribute>())
.FirstOrDefault();
return CanExecute(claimsAttribute);
}
private bool CanExecute(ClaimsPrincipalPermissionAttribute claimsAttribute)
{
if (claimsAttribute == null)
return true;
try
{
claimsAttribute.CreatePermission().Demand();
}
catch (SecurityException)
{
return false;
}
return true;
}