Еще одна вещь, которую нужно добавить к решению Маркуса, вам также может понадобиться установить HttpContext.Current.User в Thread.CurrentPrincipal, который вы создаете / олицетворяете для определенных вызовов RoleManager (например, Roles.GetRolesForUser (Identity.Name)). Если вы используете версию метода без параметров, это не нужно, но у меня есть инфраструктура авторизации, которая требует передачи имени пользователя.
Вызов этой подписи метода с олицетворенным Thread.CurrentPrincipal завершится ошибкой с «Метод поддерживается только в том случае, если параметр имени пользователя совпадает с именем пользователя в текущей идентификации Windows». Как сообщение предполагает, что в коде WindowsTokenRoleProvider есть внутренняя проверка на «HttpContext.Current.Identity.Name». Метод не работает, если они не совпадают.
Вот пример кода для ApiController, демонстрирующий авторизацию Action. Я использую олицетворение для модульного и интеграционного тестирования, чтобы можно было проводить тестирование под разными ролями AD, чтобы обеспечить безопасность до развертывания.
using System.Web
List<string> WhoIsAuthorized = new List<string>() {"ADGroup", "AdUser", "etc"};
public class MyController : ApiController {
public MyController() {
#if TEST
var myPrincipal = new WindowsPrincipal(new WindowsIdentity("testuser@contoso.com"));
System.Threading.Thread.CurrentPrincipal = myPrincipal;
HttpContext.Current.User = myPrincipal;
#endif
}
public HttpResponseMessage MyAction() {
var userRoles = Roles.GetRolesForUser(User.Identity.Name);
bool isAuthorized = userRoles.Any(role => WhoIsAuthorized.Contains(role));
}
}
Надеюсь, это поможет кому-то еще:)