我正在尝试保护控制器操作以防止用户访问他们无权访问的实体.我可以使用以下代码执行此操作.
public ActionResult Entity(string entityCode)
{
if (CurrentUser.VerifyEntityPermission(entityCode))
{
//populate viewModel...
return View(viewModel);
}
return RedirectToAction("NoAccessToEntity", "Error");
}
Run Code Online (Sandbox Code Playgroud)
我希望能够为控制器操作本身添加一个属性.为了验证对实体的访问,我需要查看传递给控制器的值以及用户可以访问的实体.这可能吗?
[EntityAuthRequired]
public ActionResult Entity(string entityCode)
{
//populate viewModel...
return View(viewModel);
}
Run Code Online (Sandbox Code Playgroud) c# security asp.net-mvc authorize-attribute controller-action
我只是ASP.NET MVC的新手,我不确定如何以"正确的方式"完成某项任务.
本质上,我将登录的userId存储在HttpContext.User.Identity中,并编写了一个EnhancedAuthorizeAttribute来执行一些自定义授权.
在overriden OnAuthorization方法中,我的域模型命中数据库以确保当前用户id可以访问传入的routeValue"BatchCode".原型是:
ReviewGroup GetReviewGroupFromBatchCode(string batchCode);
Run Code Online (Sandbox Code Playgroud)
如果用户无法访问ReviewGroup,则它将返回null,然后OnAuthorization拒绝访问.
现在,我知道装饰动作方法只有在OnAuthorization通过时才会执行,但我不想再次访问数据库以再次获取ReviewGroup.
我正在考虑将ReviewGroup存储在控制器中HttpContext.Items["reviewGroup"]并从控制器访问它.
这是一个可行的解决方案,还是我走错了路?
谢谢!
我目前正在编写一个Admin MVC 3站点,每个用户只能访问该站点的某些部分.
我的站点区域与用户角色相同,所以我想要做的是在每个区域放置AuthorizeAttribute,使用区域名称作为角色中的参数.
到目前为止,当我对每个区域的检查进行硬编码时,我已经开始工作了,但是我想循环遍历所有区域并应用授权过滤器.(我使用它作为我的自定义FilterProvider - http://www.dotnetcurry.com/ShowArticle.aspx?ID=578)
到目前为止我的代码("Gcm"是我的一个领域,也是一个角色):
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
filters.Add(new HandleErrorAttribute());
// for all controllers, run AdminAuthorizeAttribute to make sure they're at least logged in
filters.Add(ObjectFactory.GetInstance<AdminAuthorizeAttribute>());
AdminAuthorizeAttribute gcmAuthroizeAttribute = ObjectFactory.GetInstance<AdminAuthorizeAttribute>();
gcmAuthroizeAttribute.Roles = "Gcm";
var provider = new FilterProvider();
provider.Add(
x =>
x.RouteData.DataTokens["area"] != null && x.RouteData.DataTokens["area"].ToString() == "Gcm"
? gcmAuthroizeAttribute
: null);
FilterProviders.Providers.Add(provider);
}
Run Code Online (Sandbox Code Playgroud)
有谁知道如何获得我的应用程序的所有区域,所以我可以循环它们,而不是硬编码每个区域?
或者,如果有人对如何授权每个区域有更好的了解,那将是值得赞赏的.
谢谢你的帮助Saan
asp.net-mvc filter asp.net-mvc-areas authorize-attribute asp.net-mvc-3
我们想要授权用户,如果他们被授权,我们想要将他们的角色和权限添加到用户并将其添加到IPrinciple
我们有两种方法可以做到这一点就是在global.asax中执行它.AndhenticateRequest另一种方法是创建一个继承自AuthorizeAttribute的属性
这里有没有闪闪发光的好选择?
我有3个型号[用户,角色和用户角色]
Use {ID [PK], Name, Email, Password, .....}
Role {ID [PK], Name, Description, .......}
UserRole {UserID [FK], RoleID [FK]}
考虑使用[Authorize]属性在控制器上进行基于角色的授权,指定用户必须具有管理员角色才能访问类中的任何控制器操作
[Authorize(Roles = "Administrator")]
public class PageController : Controller
{
// Controller code here
}
Run Code Online (Sandbox Code Playgroud)
这很好,我需要的是,
有没有办法将我的角色集分配给[授权]属性?例如
我将从登录用户中获取已分配的角色并将其存储在列表中.是否可以将此列表分配给[授权]属性?如下所示:
[Authorize(Roles = MyDynamicallyLoadedList)]
public class PageController : Controller
{
// Controller code here
}
Run Code Online (Sandbox Code Playgroud) 我正在尝试创建自己的[Authorize]属性,这样我就可以使用自己的授权逻辑来获得分层角色.
如果有人[Authorize(Roles = "Admin")]在控制器或操作上如何在AuthorizeCore函数中获取字符串"Admin"?
我正在使用此代码:
public class Authorize : AuthorizeAttribute
{
protected override bool AuthorizeCore(HttpContextBase httpContext)
{
//authorize role logic
if (true)
return true;
return false;
}
}
Run Code Online (Sandbox Code Playgroud)
MVC4,.net 4.5,c#,VS 2012
对于我的mvc5项目,我已经实现了默认身份,但根据要求进行了更改.现在我想将未经授权的用户重定向到我创建的视图.我创建了一个自定义授权过滤器.当未经授权的用户输入时,会进入我的错误视图.我可以通过URL识别它.但问题是它没有在视图中显示内容.相反,它显示HTTP 404错误.我把我的代码放在下面.我知道这里有好几次.但我仍然无法解决它.所有帮助赞赏.提前致谢!
public class CustomAuthorize : AuthorizeAttribute
{
protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
{
if (!filterContext.HttpContext.User.Identity.IsAuthenticated)
{
base.HandleUnauthorizedRequest(filterContext);
}
else
{
filterContext.Result = new RedirectToRouteResult(new
RouteValueDictionary(new { controller = "Error", action = "AccessDenied" }));
}
}
}
Run Code Online (Sandbox Code Playgroud)
ErrorController
public class ErrorController : Controller
{
// GET: Error
public ActionResult Index()
{
return View();
}
public ActionResult AccessDenied()
{
return View();
}
}
Run Code Online (Sandbox Code Playgroud)
AccessDenied视图
<h2>AccessDenied</h2>
Access Denied
Run Code Online (Sandbox Code Playgroud)
在特定的控制器上
[CustomAuthorize(Roles = "Admin")]
public class ProductTypeController : Controller
{
}
Run Code Online (Sandbox Code Playgroud)
我得到的错误
HTTP 404.您正在查找的资源(或其中一个依赖项)可能已被删除,名称已更改或暂时不可用.请查看以下网址,确保拼写正确. …
asp.net-mvc authorize-attribute asp.net-mvc-5 asp.net-identity asp.net-identity-2
我有一个自定义实现AuthorizeAttribute该手柄未经授权的用户访问了我重写了以下方法:AuthorizeCore,然后HandleUnauthorizedRequest.
AuthorizeCore.HandleUnauthorizedRequest.现在,我想知道如何将AuthorizeCore中的数据发送到控制器/操作?遵循该顺序:
AuthorizeCore 创建一条消息.HandleUnauthorizedRequest 执行重定向并传递先前创建的消息.注意:我不想通过QueryString接收消息.
我的自定义AuthorizeAttribute遇到了一些问题
public class ExplicitAuthorizeAttribute : AuthorizeAttribute
{
private readonly MembershipUserRole[] _acceptedRoles;
public ExplicitAuthorizeAttribute()
{
}
public ExplicitAuthorizeAttribute(params MembershipUserRole[] acceptedRoles)
{
_acceptedRoles = acceptedRoles;
}
protected override bool AuthorizeCore(HttpContextBase httpContext)
{
//Validation ...
}
}
Run Code Online (Sandbox Code Playgroud)
我这样使用它:
[ExplicitAuthorize[(MembershipUserRole.Admin, MembershipUserRole.SuperAdmin)]
Run Code Online (Sandbox Code Playgroud)
它非常适合HttpGet和HttpPost验证我的控制器和方法.
但是当我在ApiController中使用它并进行ajax调用时,AuthorizeCore没有运行,我遇到了安全漏洞.:/
我的枚举看起来像这样
[Flags]
public enum MembershipUserRole
{
Admin= 1,
SuperAdmin = 2
}
Run Code Online (Sandbox Code Playgroud)
有谁知道为什么我的AuthorizeCore在这种情况下没有验证?
顺便说一下如果我用
[Authorized(Roles ="Admin, SuperAdmin")]
Run Code Online (Sandbox Code Playgroud)
这是完美的验证,但我想要Stronly Typed Roles,这就是我使用枚举的原因.
从这篇文章中得到帮助:
https://docs.microsoft.com/en-us/aspnet/core/security/authorization/policies
我尝试为我的操作创建一些策略,但在某些操作中我想要多个策略,如果用户拥有其中一个,他们可以访问控制器的操作:
[Authorize(Policy = "CanAccessMenu1")]
[Authorize(Policy = "CanAccessMenu2")]
public async Task<IActionResult> ActionFroMultiplePolicies([FromBody] ActionRequest request)
{
//..............
}
Run Code Online (Sandbox Code Playgroud)
我怎样才能合并这个政策?我可以使用这样的东西吗?
[授权(政策=“CanAccessMenu1,CanAccessMenu2”)]
在这种情况下,也许我需要对此覆盖功能进行一些更改。但我对此没有任何想法:
Protected override async Task HandleRequirementAsync(AuthorizationHandlerContext context, CanAccessRequirement requirement)
{
}
Run Code Online (Sandbox Code Playgroud)
谢谢你的帮助
authorization controller authorize-attribute data-annotations asp.net-core
asp.net-mvc ×6
c# ×5
actionmethod ×1
ajax ×1
api ×1
asp.net ×1
asp.net-core ×1
controller ×1
filter ×1
role-based ×1
security ×1