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安全组的用户才能访问此应用程序
我已经用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
}