MVC应用程序中的授权和身份验证
我有一个使用MVC 2在C#中开发的内部Web应用程序。我想使用AD角色/组来进行授权。因此我有3个访问组Admin,Basic,Readonly。将通过这些组来控制对应用程序的访问。
现在,当我点击我的MVC应用的操作/页面时,要求是:
1)检查访问级别(在Admin,Basic或Readonly组中)
2)如果在一个组中 - 为页面提供服务。 如果不是 - 请提供401 Unauthorized页面。
我可能会对概念授权/身份验证感到困惑,但到目前为止这是设置的方式(来自答案,谷歌和我自己的努力来自question:
public static class AuthorizationModule
{
public static bool Authorize(HttpContext httpContext, string roles)
{
...
//Check Configuration.AppSettings for the roles to check
//using httpContext.User check .IsInRole for each role and return true if they are
...
//other wise throw new HttpException(401,.....)
}
...
}
public class AuthorizeByConfigurationAttribute : AuthorizeAttribute
{
protected override bool AuthorizeCore(HttpContextBase httpContext)
{
//Essentially at the moment this is pretty much the same as AuthorizationModule.Authorize(HttpContext httpContext, string roles)
}
}
//This code from http://paulallen.com.jm/blog/aspnet-mvc-redirect-unauthorized-access-page-401-page
public class RequiresAuthenticationAttribute : AuthorizeAttribute
{
protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
{
if (filterContext.HttpContext.User.Identity.IsAuthenticated)
{
filterContext.Result = new ViewResult {ViewName = "AccessDenied"};
}
else
{
base.HandleUnauthorizedRequest(filterContext);
}
}
}
这个问题是我现在需要两次装饰我的动作方法,ala:
[AuthorizeByConfiguration(Roles = "Admin, Basic, Readonly")]
[RequiresAuthentication(Roles = "Admin, Basic, Readonly")]
public ActionResult Index(string msg)
{
...
}
接下来的问题是,似乎我有三种不同的方法都试图做同样的事情。我根据建议重写方法,并不完全确定它们最初是如何工作的。我怎么能实现我的要求?
编辑:由于这是一个IntrAnet应用,所有使用其网络帐户登录的用户都可以访问此应用。我需要限制访问权限,以便只有属于某些Active Directory安全组的人才能访问此应用
答案 0 :(得分:2)
我已经使用接口IAuthorization包装了有关auth的所有方法。
以下是您需要添加Roles属性和您自己的实现的自定义attrbiute示例。
属性因可测试性原因调用过滤器本身。
public class SomeAuthorizeAttribute : AuthorizeAttribute
{
public override void OnAuthorization(AuthorizationContext filterContext)
{
var filter = new SomeAuthorizeFilter(DependencyLookup.Resolve<IAuthorization>());
filter.OnAuthorization(filterContext);
}
}
public class SomeAuthorizeFilter : IAuthorizationFilter
{
private readonly IAuthorization _authorization;
public SomeAuthorizeFilter(IAuthorization authorization)
{
_authorization = authorization;
}
protected virtual ActionResult ResultWhenNotAuthenticated(AuthorizationContext filterContext)
{
//snip..
//default
RouteValueDictionary redirectTargetDictionary = new RouteValueDictionary
{
{"action", "Index"},
{"controller", "Home"}
};
return new RedirectToRouteResult(redirectTargetDictionary);
}
#region IAuthorizationFilter Members
public void OnAuthorization(AuthorizationContext filterContext)
{
if (!_authorization.GetCurrentUserIdentity().IsAuthenticated)
{
filterContext.Result = ResultWhenNotAuthenticated(filterContext);
}
}
#endregion
}