Я использую ASP.NET MVC 1.1 с аутентификацией Windows. Я пытающийся только авторизовать членов группы и меня. Я не член группы и не должен был бы быть членом этой группы. Я получаю окна подсказка login/password каждый раз, когда я получаю доступ к URL веб-приложения. HomeController имеет
[HandleError]
[Authorize(Roles=@"MyDomain\\company.security.group.name")]
[Authorize(Users=@"MyDoamin\\MyName")]
[OutputCache(Duration=86400,VaryByParam="PageIndex")]
public class HomeController : Controller
Как я включаю такую авторизацию? Веб-приложение работает под сайтом на IIS6. Сайт имеет безопасность каталога для принятия анонимный. Веб-приложение / виртуальный каталог имеет анонимный отключенный и включенный Windows Integrated security. web.config имеет
Вы можете подтип averizeAttribute
, чтобы посмотреть на пользователях и ролей. С верхней части моей головы (непроверенной):
using System;
using System.Linq;
using System.Security.Principal;
using System.Web;
using System.Web.Mvc;
public class MyAuthorizeAttribute : AuthorizeAttribute
{
// This method must be thread-safe since it is called by the thread-safe OnCacheAuthorization() method.
protected override bool AuthorizeCore(HttpContextBase httpContext) {
base.AuthorizeCore(httpContext);
if ((!string.IsNullOrEmpty(Users) && (_usersSplit.Length == 0)) ||
(!string.IsNullOrEmpty(Roles) && (_rolesSplit.Length == 0)))
{
// wish base._usersSplit were protected instead of private...
InitializeSplits();
}
IPrincipal user = httpContext.User;
if (!user.Identity.IsAuthenticated) {
return false;
}
var userRequired = _usersSplit.Length > 0;
var userValid = userRequired
&& _usersSplit.Contains(user.Identity.Name, StringComparer.OrdinalIgnoreCase);
var roleRequired = _rolesSplit.Length > 0;
var roleValid = (roleRequired)
&& _rolesSplit.Any(user.IsInRole);
var userOrRoleRequired = userRequired || roleRequired;
return (!userOrRoleRequired) || userValid || roleValid;
}
private string[] _rolesSplit = new string[0];
private string[] _usersSplit = new string[0];
private void InitializeSplits()
{
lock(this)
{
if ((_rolesSplit.Length == 0) || (_usersSplit.Length == 0))
{
_rolesSplit = Roles.Split(',');
_usersSplit = Users.Split(',');
}
}
}
}
Поскольку вы используете префикс строк domain/user и domain/group с символом '@', вам не нужно дважды экранировать обратный слеш. Вы можете попробовать заменить эти строки на:
[Authorize(Roles="MyDomain\\company.security.group.name")]
[Authorize(Users="MyDoamin\\MyName")]
или
[Authorize(Roles=@"MyDomain\company.security.group.name")]
[Authorize(Users=@"MyDoamin\MyName")]
Немного дальнейшего чтения также показало, что фильтр Authorize выполняет проверку "пользователей" и "ролей". Если пользователь не соответствует обоим требованиям, то ему будет отказано в доступе.
Чтобы получить желаемое поведение, вам нужно написать пользовательский фильтр авторизации, как было предложено в предыдущем ответе.