我试图在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);
}
}
答案 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,那么你就不会跳过这个重要的逻辑。
如果您需要更改用户重定向的位置,您可以覆盖AuthorizeCore
,HandleUnauthorizedRequest
仅在授权失败时执行。
最后,如果您需要访问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};
}
});
来解决此问题。