Sex*_*yMF 5 c# security asp.net-mvc
出于某种原因,只OnAuthorization调用了方法,但AuthorizeCore没有.
这就是我所说的:
[AuthorizeWithRoles(Roles = "Affiliate")]
public string TestOnlyAffiliate()
{
return "ok";
}
Run Code Online (Sandbox Code Playgroud)
这是实际属性.
public class AuthorizeWithRolesAttribute : AuthorizeAttribute
{
public string Roles { get; set; }
//
//AuthorizeCore - NOT INVOKING!
//
protected override bool AuthorizeCore(HttpContextBase httpContext)
{
return true;
}
public void OnAuthorization(AuthorizationContext filterContext)
{
}
}
Run Code Online (Sandbox Code Playgroud)
use*_*702 10
你不应该覆盖OnAuthorization.它处理潜在的缓存问题和调用AuthorizeCore.
// In the worst case this could allow an authorized user
// to cause the page to be cached, then an unauthorized user would later be served the
// cached page.
Run Code Online (Sandbox Code Playgroud)
把你的自定义逻辑放入AuthorizationCore.
GWt*_*dev -1
不确定这是否对您有帮助,但我遇到了同样的事情,并确定,至少就我的目的而言,我根本不需要覆盖 AuthorizeCore。老实说,我不确定它为什么在那里。正如 MSDN 所说,“当进程请求授权时”会调用 OnAuthorization。这意味着它将被任何具有 AuthorizeWithRoles 属性的方法调用。您可以将自定义代码放在 OnAuthorization 中来检查用户是否具有权限,并且由于您可以从 filterContext 获取 httpContext,因此实际上不需要 AuthorizeCore。这是一个对我有用的简单示例:
public class LoginRequired : AuthorizeAttribute
{
public override void OnAuthorization(AuthorizationContext filterContext)
{
if (Common.ValidateCurrentSession(filterContext.HttpContext))
{
//this is valid; keep going
return;
}
else
{
//this is not valid; redirect
filterContext.Result = new RedirectResult("/login");
}
}
}
Run Code Online (Sandbox Code Playgroud)
我希望这有帮助。除此之外,显然您需要声明 OnAuthorization 是一个覆盖。
编辑:我相信基本的 OnAuthorization 方法是调用 AuthorizeCore 的方法。由于您要覆盖 OnAuthorization,显然该调用会丢失。我相信只有当您单独保留 OnAuthorization 或在重写方法中调用 base.OnAuthorization(filterContext) 时,重写 AuthorizeCore 才有意义。
| 归档时间: |
|
| 查看次数: |
9258 次 |
| 最近记录: |