我已经制作了自己的自定义athorizeattribute。它只触发一次(直接在具有此属性的第一个actionresult之后)。但是,当我尝试采取相同的行动时,它会起作用(这会导致安全漏洞)。
控制器:
public class IsLoggedInAsHero : AuthorizeAttribute
{
protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
{
if (!isAuthenticatedAsHero())
{
filterContext.Result = new RedirectToRouteResult(
new RouteValueDictionary(new { controller = "Account", action = "Login" })
);
}
}
}
AuthenticationController:
public static bool isAuthenticatedAsHero()
{
User user = new User();
user = udc.GetUserByCookie();
if (user.Hero== 1 && System.Web.HttpContext.Current.User.Identity.IsAuthenticated)
{ return true; }
else return false;
}
isAuthenticatedAsHero():
var firstname = $("#FirstName").val().replace(/å/gi, "a").replace(/ä/gi,"a").replace(/ö/gi, "o").replace(/[^a-z0-9\s]/gi, '');
var lastname = $("#LastName").val().replace(/å/gi, "a").replace(/ä/gi, "a").replace(/ö/gi, "o").replace(/[^a-z0-9\s]/gi, '');
$("#Mail").val(firstname + "." + lastname + '@customer.Email');
非常感谢帮助!
答案 0 :(得分:1)
我不确定这是否是您的解决方案,但据我认为,您应该覆盖此方法:
protected override bool AuthorizeCore(HttpContextBase httpContext){
return isAuthenticatedAsHero();
}
和强>
protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
{
filterContext.Result = new RedirectToRouteResult(
new RouteValueDictionary(new { controller = "Account", action = "Login" })
);
}
答案 1 :(得分:1)
最好让基类处理未经授权的请求,如果用户未经授权,它将返回401状态代码。然后ASP.Net框架检查您的网站是否启用了表单身份验证,然后它将自动重定向到登录页面。
因此,您的IsLoggedInAsHero类应该如下所示
public class IsLoggedInAsHero : AuthorizeAttribute
{
protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
{
if (!isAuthenticatedAsHero())
{
base.HandleUnauthorizedRequest(filterContext);
}
}
}
您需要在web.config文件中启用表单身份验证。
<authentication mode="Forms">
<forms loginUrl="~/Account/Login" />
</authentication>
答案 2 :(得分:0)
在我的大多数系统中,我都有一个用户通常被称为“仪表板”的分区。这是我的授权示例:
public class DashBoardAuthorizeAttribute : AuthorizeAttribute
{
/// <summary>
/// Handles the unauthorized request.
/// </summary>
/// <param name="context">The context.</param>
protected override void HandleUnauthorizedRequest(AuthorizationContext context)
{
var newName = "UserContext" + HttpContext.Current.User.Identity.Name;
var cache = MemoryCache.Default;
var userContext = cache.Get(newName) as IUserModel;
if (userContext != null && !userContext.DashBoardAccess)
{
var urlHelper = new UrlHelper(context.RequestContext);
var address = urlHelper.Action("Index", "Home");
context.Result = new RedirectResult(address ?? "login");
}
else
{
base.HandleUnauthorizedRequest(context);
}
}
}
在我的控制器上或在个人行动中:
[DashBoardAuthorizeAttribute]
public async Task<ActionResult> GetUsers(){
return View();
}
这将在每次执行任何操作之前执行。您应该在将来的项目中重新评估您的命名约定。如果我是另一个受雇于此项目的开发人员,我不知道“IsLoggedInAsHero”是什么或应该做什么,除非我打开代码并查看它。命名惯例应该基本上传达它为了便于开发而应该做些什么。使用“DashBoardAuthorizeAttribute”,另一个开发人员可以假设它是一个与“仪表板”相关的授权属性。