- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我在 ASP.NET MVC 中为我的应用程序使用基于权限的授权系统。为此,我创建了一个自定义授权属性
public class MyAuthorizationAttribute : AuthorizeAttribute
{
string Roles {get; set;}
string Permission {get; set;}
}
这样我就可以通过角色或带有注释的特定权限 key 来授权用户,例如
public class UserController : Controller
{
[MyAuthorization(Roles="ADMIN", Permissions="USER_ADD")]
public ActionResult Add()
[MyAuthorization(Roles="ADMIN", Permissions="USER_EDIT")]
public ActionResult Edit()
[MyAuthorization(Roles="ADMIN", Permissions="USER_DELETE")]
public ActionResult Delete()
}
然后我用类似的逻辑(伪代码)覆盖 MyAuthorizationAttribute 类中的 AuthorizeCore() 方法
protected override bool AuthorizeCore(HttpContextBase httpContext)
{
if(user not authenticated)
return false;
if(user has any role of Roles)
return true;
if(user has any permission of Permissions)
return true;
return false;
}
到目前为止一切正常。
现在我需要某种扩展方法,以便我可以在 View 页面中动态生成操作 url,该 url 将根据给定操作的 MyAuthorization 属性授权逻辑返回操作 url。喜欢
@Url.MyAuthorizedAction("Add", "User")
如果用户具有管理员角色或具有“USER_ADD”权限(在操作的属性中定义),则返回“用户/添加”的 url,否则返回空字符串。
但是在网上查了几天,还是没弄明白。 :(
到目前为止我只找到了这个 "Security aware" action link?它通过执行操作的所有操作过滤器来工作,直到它失败。
这很好,但我认为每次调用 MyAuthorizedAction() 方法时执行所有操作筛选器会产生开销。此外它也不适用于我的版本(MVC 4 和 .NET 4.5)
我需要做的就是根据给定操作的授权角色和权限检查经过身份验证的用户的角色、权限(将存储在 session 中)。像下面的东西(伪代码)
MyAuthorizedAction(string actionName, string controllerName)
{
ActionObject action = SomeUnknownClass.getAction(actionName, controllerName)
MyAuthorizationAttribute attr = action.returnsAnnationAttributes()
if(user roles contains any in attr.Roles
or
user permissions contains any attr.Permissions)
{
return url to action
}
return empty string
}
我找了很久的获取 Action 属性值的解决方案,一直找不到足够好的资源。我错过了正确的关键字吗? :/
如果有人能为我提供真正有帮助的解决方案。提前感谢解决方案
最佳答案
虽然我同意基于权限生成 url 可能不是最佳实践,但如果您仍然想继续,您可以使用这些找到操作及其属性:
检索“操作”方法:这将检索方法信息的集合,因为可能有多个 Controller 类具有相同的名称和多个具有相同名称的方法,特别是在使用区域时。如果你不得不担心这个,我会把歧义留给你。
public static IEnumerable<MethodInfo> GetActions(string controller, string action)
{
return Assembly.GetExecutingAssembly().GetTypes()
.Where(t =>(t.Name == controller && typeof(Controller).IsAssignableFrom(t)))
.SelectMany(
type =>
type.GetMethods(BindingFlags.Public | BindingFlags.Instance)
.Where(a => a.Name == action && a.ReturnType == typeof(ActionResult))
);
}
从 MyAuthorizationAttributes 中检索权限:
public static MyAuthorizations GetMyAuthorizations(IEnumerable<MethodInfo> actions)
{
var myAuthorization = new MyAuthorizations();
foreach (var methodInfo in actions)
{
var authorizationAttributes = methodInfo
.GetCustomAttributes(typeof (MyAuthorizationAttribute), false)
.Cast<MyAuthorizationAttribute>();
foreach (var myAuthorizationAttribute in authorizationAttributes)
{
myAuthorization.Roles.Add(MyAuthorizationAttribute.Role);
myAuthorization.Permissions.Add(MyAuthorizationAttribute.Permission);
}
}
return myAuthorization;
}
public class MyAuthorizations
{
public MyAuthorizations()
{
Roles = new List<string>();
Permissions = new List<string>();
}
public List<string> Roles { get; set; }
public List<string> Permissions { get; set; }
}
最后是 AuthorizedAction 扩展: 警告:如果给定的 Controller /操作对有多个匹配项,如果用户获得其中任何一个的授权,这将提供“授权”url。 ..
public static string AuthorizedAction(this UrlHelper url, string controller, string action)
{
var actions = GetActions(controller, action);
var authorized = GetMyAuthorizations(actions);
if(user.Roles.Any(userrole => authorized.Roles.Any(role => role == userrole)) ||
user.Permissions.Any(userPermission => authorized.Permissions.Any(permission => permission == userPermission)))
{
return url.Action(controller,action)
}
return string.empty;
}
根据权限生成url的注意事项:
我声明这可能不是最佳实践,因为有很多小问题。根据您的情况,每个人都可能有自己的相关程度。
通过操作授权属性控制页面呈现:将 AuthorizedAction
方法修改为 boolean
,然后使用其结果来控制页面呈现。
public static bool AuthorizedAction(this HtmlHelper helper, string controller, string action)
{
var actions = GetActions(controller, action);
var authorized = GetMyAuthorizations(actions);
return user.Roles.Any(userrole => authorized.Roles.Any(role => role == userrole)) ||
user.Permissions.Any(userPermission => authorized.Permissions.Any(permission => permission == userPermission))
}
然后在您的 Razor 页面中使用它。
@if(Html.AuthorizedAction("User","Add")){
<div id='add-user-section'>
If you see this, you have permission to add a user.
<form id='add-user-form' submit='@Url.Action("User","Add")'>
etc
</form>
</div>
}
else {
<some other content/>
}
关于c# - 如何在 ASP.NET MVC 4 中获取 Controller 操作的自定义注释属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13201250/
我试图对 ASP.Net MVC 有一个高层次的理解,我开始意识到它看起来很像原始的 ASP 脚本。过去,我们将“模型”/业务逻辑代码组织到 VBScript 类或 VB COM 组件中。 当然,现在
我已经搜索了一段时间,但似乎找不到答案。 我想在我的旋转木马中显示一个计数器,左边是当前项目(工作),左边是项目总数。 我的代码:
. 最佳答案 Scott Gu 称这些为代码块。这就是我的看法。 http://weblogs.asp.net/scottgu/archive/2010/04/06/new-lt-gt-syntax
我有一个使用 Visual Studio 2010/.net 4/VB 制作的网站。 我真的很喜欢我发现的 FAQ 系统的布局,因为它很简单,但它是经典的 asp。所以,显然,我不能包括我的母版页布局
好吧,对于你们许多人来说,这个问题可能有一个非常明显的答案,但它让我难住了。 我有一个 asp.net Web 表单,上面有两个控件(嗯,不止这两个,但我们将重点关注这些) - 第一个是 asp:dr
当我将 ASP.NET 复选框控件设置为 asp.net 更新面板的异步回发触发器时,EventName 属性是什么? 最佳答案 我相信它是 CheckedChanged。 关于asp.net - a
我有一个用经典 asp 编写的(巨大的)网站。现在我必须切换到 vb.net (razor)。有没有办法将这两个结合起来直到切换完成? 有没有办法让应用程序与经典的 asp 和 vb.net 一起工作
I am creating a products page, where the user selects an option in a radiobuttonlist for example, an
我最近将一个经典的 ASP 应用程序转换为 ASP.NET 3.5,但我觉得我的经典 ASP 版本要快一些(我不知道可能买家会后悔)。 所以你们能帮我解决这个问题吗,让我知道哪个更快,asp、asp.
从本周开始,我被要求开始学习如何使用 ASP 开发网站。我通过 XNA 对 C# 有一定的经验,所以这部分对我来说并不是什么麻烦。 我一直在关注Music Store Tutorial这需要我设置一个
关闭。这个问题需要多问focused 。目前不接受答案。 想要改进此问题吗?更新问题,使其仅关注一个问题 editing this post . 已关闭 8 年前。 Improve this ques
我想将一些表单变量发布到经典 ASP 页面中。我不想改变经典的 ASP 页面,因为需要完成大量的工作,以及消耗它们的页面数量。 经典的 ASP 页面需要将表单变量 Username 和 Userpas
已结束。此问题正在寻求书籍、工具、软件库等的推荐。它不满足Stack Overflow guidelines 。目前不接受答案。 我们不允许提出寻求书籍、工具、软件库等推荐的问题。您可以编辑问题,以便
在某种程度上,这可能是一个异端问题。我们有一个大型站点,其中许多页面仍在ASP中。通常,并没有真正动态的,而是包括(通过SSI或Server.Execute)定期重新生成的HTML块。看起来好像是一个
关闭。这个问题需要多问focused 。目前不接受答案。 想要改进此问题吗?更新问题,使其仅关注一个问题 editing this post . 已关闭 9 年前。 Improve this ques
我有一个遗留的 ASP 应用程序——在不久的某个时候——需要迁移到 ASP.Net 2.0(以与也在 2.0 中的其他应用程序兼容)。 对于这类事情是否有最佳实践,即作为第一步将当前 html、vbs
我目前在一家公司工作,该公司使用 ASP.NET Webforms 和旧 ASP 页面的组合进行 Web 开发。这对于他们当前的项目来说效果很好,但我想说服/建议他们切换到 ASP.NET MVC,因
我有一个经典的 asp 应用程序。我想将该页面的竞赛表格发布到 Asp.Net 表格。原因是我想在进入数据库之前使用我在 Asp.Net 页面中内置的大量逻辑进行验证,而我对 asp 不太了解。更不用
我知道在 ASP.NET MVC 中,您可以拥有移动 View 并执行类似 Index.mobile.cshtml 的操作。和 _Layout.mobile.cshtml并且服务器知道将这些 View
我需要从一些服务器端 c#.net 代码中调用经典 asp 页面上的 VBscript 函数 - 有谁知道一种干净的方法来做到这一点?在 .net 中重写函数不是一种选择。 我会再解释一下这个问题..
我是一名优秀的程序员,十分优秀!