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

本文关键字:身份验证 授权 应用程序 MVC | 更新日期: 2023-09-27 18:05:09

MVC应用中的授权和认证

我有一个内部web应用程序开发在c#使用MVC 2。我想使用AD角色/组进行授权。因此,我有3个访问组Admin,基本,只读。对应用程序的访问将通过这些组进行控制。

现在当我点击MVC应用程序的动作/页面时,要求是:

1)检查访问级别(在Admin, Basic或Readonly组中)

2)如果在一个组中-服务页面。如果没有-提供401未授权页面。

我可能对授权/身份验证的概念感到困惑,但这是迄今为止它是如何设置的(从答案,谷歌和我自己的努力从这个问题:

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)
        {
            ...
        }

下一个问题是,似乎我有三个独立的方法都试图做同样的事情。我重写了基于建议的方法,并不完全确定它们最初是如何工作的。我怎样才能实现我的需求呢?

edit:由于这是一个内部网应用程序,所有使用其网络帐户登录的用户都可以访问此应用程序。我需要限制访问权限,以便只有属于某些Active Directory安全组的用户才能访问此应用程序

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

我已经用IAuthorization接口包装了所有与auth相关的方法。

下面是一个示例自定义属性,您需要添加Roles属性和您自己的实现。

属性出于可测试性的原因调用过滤器本身。

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
}