CustomAuthorizeAttribute - HttpActionContext而不是AuthorizationContext

时间:2017-12-13 20:20:26

标签: c# asp.net-mvc-4 authorization

我试图在MVC4 / Razor中创建一个自定义授权属性,并且遇到了问题" AllowAnnoymous"在自定义授权属性下运行的属性(似乎忽略它)。通过检查控制器或操作是否包含允许匿名属性然后允许传递(如果是这样),我找到了解决方案(见下文),这一切都很好。

但是,当我创建" AuthorizeAttribute"上课并尝试实施" OnAuthorization" override,它将对象处理程序设置为" AuthorizationContext"但是在下面的例子和我在这里找到的许多其他例子中,它似乎是" AuthorizationContext"不应该使用 - 而应该是" HttpActionContext"。虽然我试图用" HttpActionContext"替换它。然后覆盖失败,说没有合适的方法。关于我错过/做错的任何想法?

Example Found Here (By Jammer)

private static bool SkipAuthorization(HttpActionContext actionContext)
{
    Contract.Assert(actionContext != null);

    return actionContext.ActionDescriptor.GetCustomAttributes<AllowAnonymousAttribute>().Any()
               || actionContext.ControllerContext.ControllerDescriptor.GetCustomAttributes<AllowAnonymousAttribute>().Any();
}

public override void OnAuthorization(HttpActionContext actionContext)
{
        base.OnAuthorization(actionContext);
}

我的代码

private override void OnAuthorization(AuthorizationContext filterContext) // Not sure how to change this to HttpActionContext
{
    if (filterContext == null) throw new ArugmentException("filterContext");
    if (!AllowAnnonymous(new HttpActionContext()))
    {
        throw new HttpResponseException(HttpStatusCode.UnAuthorized);
    }
    else
    {
        base.OnAuthorization(filterContext);
    }
}

1 个答案:

答案 0 :(得分:3)

  

关于我错过/做错的任何想法?

首先,您正在查看使用Web API System.Web.Http.AuthorizeAttribute而不是MVC System.Web.Mvc.AuthorizeAttribute的示例。 MVC和Web API是独立的框架,它们都不会识别其他属性。这也是您在import Vue from 'vue' import Quasar from 'quasar' import firebase from 'firebase' import 'firebase/firestore' Vue.config.productionTip = false Vue.use(Quasar) let app; firebase.initializeApp({ apiKey: "", authDomain: "", databaseURL: "", projectId: "", storageBucket: "", messagingSenderId: "" }) firebase.auth().onAuthStateChanged(user=> { if (user) { let ref = firebase.firestore().collection('users').doc(user.uid) ref.get().then(snapshot=>{ // Error !! : Missing or insufficient permissions. } } if(!app){ Quasar.start(() => { app = new Vue({ el: '#q-app', render: h => h(require('./App').default) }) }) } }) 中使用不同上下文类型的原因。

其次,您的自定义AuthorizeAttribute无法识别AuthorizeAttribute的原因是因为您覆盖了AllowAnonymousAttribute中检查的逻辑(以及其他重要的交易逻辑)带输出缓存)。如果你改写覆盖OnAuthorization并返回true / false,那么你就不会跳过这个重要的逻辑。

如果您需要更改用户重定向的位置,您可以覆盖AuthorizeCoreHandleUnauthorizedRequest仅在授权失败时执行。

最后,如果您需要访问ActionDescriptor来扫描自己的属性,则会通过OnAuthorization将其传递到AuthorizationContext.ActionDescriptor。遗憾的是,它并未自动传递到AuthorizeCore,但您可以通过HttpContext.Items中的OnAuthorization将其设置为this example中的this.addGuestForm = this.formBuilder.group({ 'name': new FormControl(null, Validators.required), 'email': '', 'mobile': '' }, { validator: (formControl) => { var emailCtrl = formControl.controls.email; var mobileCtrl = formControl.controls.mobile; if (emailCtrl != undefined && mobileCtrl != undefined) if(!(emailCtrl.value.length || mobileCtrl.value.length )) return {invalid: true}; } }); 来解决此问题。