我正在尝试构建自定义AuthorizeAttribute,所以在我的Core项目(类库)中我有这样的代码:
using System;
using System.Web;
using System.Web.Mvc;
using IVC.Core.Web;
using System.Linq;
namespace IVC.Core.Attributes
{
public class TimeShareAuthorizeAttribute : AuthorizeAttribute
{
protected override bool AuthorizeCore(HttpContextBase httpContext)
{
if(!httpContext.Request.IsAuthenticated)
return false;
var rolesProvider = System.Web.Security.Roles.Providers["TimeShareRoleProvider"];
string[] roles = rolesProvider.GetRolesForUser(httpContext.User.Identity.Name);
if(roles.Contains(Website.Roles.RegisteredClient, StringComparer.OrdinalIgnoreCase))
{
return true;
}
return false;
}
protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
{
filterContext.Result = new RedirectResult("/TimeShare/Account/LogOn");
base.HandleUnauthorizedRequest(filterContext);
}
}
}
Run Code Online (Sandbox Code Playgroud)
当我尝试构建该东西时,我收到此错误:错误2'IVC.Core.Attributes.TimeShareAuthorizeAttribute.AuthorizeCore(System.Web.HttpContextBase)':找不到合适的方法来覆盖 ...
我在这里错过了什么吗?我已经搜索了所有网站,但我找到的每个网站都告诉我要完成我在这里所做的事情.我正在使用mvc2 btw.
这将是我的第一个带有表单身份验证的ASP.NET MVC应用程序,所以我试图确保我不会错过任何东西.场景是这样的:公共/安全区域.
在私人区域内,它甚至进一步限于特定区域/用户.这些"区域"由对每个用户组自定义的基本区域的自定义定义.
例如,用户可以访问url /Area/Controller/Action.他们需要获得安全区域的许可,否则他们将被重定向到登录视图.
我一直在阅读AuthorizeAttribute但我不确定我应该如何/在哪里进行这些基本检查.我最初的预感是在用户的IP成功登录以及他们有权访问的内容等详细信息后,在会话中存储用户对象.
每个安全控制器调用的授权检查将验证会话中是否存在有效用户对象,IP仍然匹配,并且用户可以访问特定区域.这个设置有没有明显的漏洞?
编辑:在哪里/如何实现这些检查,以便当控制器被[授权]标记时,它将执行那些会话对象检查?
任何指针或建议将不胜感激.谢谢.
我有一个非常简单的场景.我想用自定义授权属性装饰我的控制器/操作.如果任何属性有效,则应授予授权.例如,
[MyAuth(1)]
[MyAuth(2)]
public class MyController : Controller
{
...
}
Run Code Online (Sandbox Code Playgroud)
我无法将参数组合到单个授权属性中.以上示例仅是一个简化示例.
如果任一属性授权用户,我希望用户获得授权.我认为ActionFilterAttribute或者AuthorizeAttribute有办法看看其他过滤器已被执行并等待执行,但没有这样的运气.
我怎么能做到这一点?由于属性似乎没有任何意识,也许是HttpModule?一个习惯ControllerActionInvoker?
授权过滤器允许您指定可以访问控制器或操作的指定用户组:
[Authorize(Roles="Administrator")]
public class HomeController : Controller
{
// code
}
Run Code Online (Sandbox Code Playgroud)
我想知道是否可以指定一组无法访问控制器或操作的用户.
我试图让授权接受角色作为枚举或智能枚举, 这样我就不必调试魔术字符串及其拼写错误
但我一直因这两个错误而陷入死胡同:
属性构造函数参数“roles”的类型为“Role[]”,这不是有效的属性参数类型
属性参数必须是属性参数类型的常量表达式、typeof 表达式或数组创建表达式
这是我的代码:
授权角色.cs
public class AuthorizeRoles : AuthorizeAttribute
{
public AuthorizeRoles(params Role[] roles)
{
string allowed = string.Join(", ", roles.ToList().Select(x => x.Name));
Roles = allowed;
}
}
Run Code Online (Sandbox Code Playgroud)
角色.cs
public class Role
{
public readonly string Name;
public enum MyEnum // added
{
Admin,
Manager
}
public static readonly Role Admin = new Role("Admin");
public static readonly Role Manager = new Role("Manager");
public Role(string name)
{
Name = name;
}
public override string ToString()
{ …Run Code Online (Sandbox Code Playgroud)