我正在使用带有Windows身份验证的ASP.NET MVC 1.1。我试图只授权一个团体的成员和我自己。我不是该组的成员,也不需要成为该组的成员。每次访问网络应用程序的URL时,我都会收到Windows登录/密码提示。 HomeController有
[HandleError]
[Authorize(Roles=@"MyDomain\\company.security.group.name")]
[Authorize(Users=@"MyDoamin\\MyName")]
[OutputCache(Duration=86400,VaryByParam="PageIndex")]
public class HomeController : Controller
如何启用此类授权? Web应用程序在IIS6上的站点下运行。该站点具有目录安全性以接受匿名。 Web应用程序/虚拟目录已禁用匿名并启用了Windows集成安全性。 web.config有
答案 0 :(得分:13)
您可以子类型AuthorizeAttribute
来查看用户和角色。脱离我的头顶(未经测试):
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(',');
}
}
}
}
答案 1 :(得分:13)
当您使用“@”字符为域/用户和域/组字符串添加前缀时,您无需双击反斜杠。您可以尝试使用以下任一项替换这些行:
[Authorize(Roles="MyDomain\\company.security.group.name")]
[Authorize(Users="MyDoamin\\MyName")]
或
[Authorize(Roles=@"MyDomain\company.security.group.name")]
[Authorize(Users=@"MyDoamin\MyName")]
进一步阅读还表明,授权过滤器将执行“用户”和“角色”检查。如果用户不满足这两个要求,那么他们将被拒绝访问 要获得所需的行为,您需要按照上一个答案中的建议编写自定义授权过滤器。