MVC应用程序中的授权和身份验证

时间:2011-08-09 03:57:08

标签: c# asp.net-mvc asp.net-mvc-2 authentication authorization

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安全组的人才能访问此应用

1 个答案:

答案 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
}