ठीक है, मैं सिर्फ MVC v2.0 के लिए एक परियोजना अपग्रेड किया गया है, और eduncan911 के समाधान अब और काम नहीं करता है अगर आप AuthorizeAttribute
पर उपयोग आपके नियंत्रक कार्यों। यह समझना मुश्किल था कि क्यों।
तो, कहानी में अपराधी यह है कि एमवीसी टीम ने के मूल्य में ViewContext.HttpContext.User.Identity.Name
संपत्ति का उपयोग जोड़ा।
बेस नियंत्रक में ओवरराइड OnAuthorization
नियंत्रक कार्रवाई पर किसी भी फ़िल्टर से पहले निष्पादित किया जाता है। इसलिए, समस्या यह है कि प्राधिकरण विशेषता अभी तक लागू नहीं हुई है और इसलिए ViewContext.HttpContext.User
सेट नहीं है। तो UserName स्ट्रिंग है। लक्षण जबकि एंटीफ़ोर्गेरी टोकन सत्यापन के लिए उपयोग किया जाता है, वास्तविक उपयोगकर्ता नाम = असफल होता है।
हम इसे अब हल इस कोड के साथ:
public abstract class MyBaseController : Controller
{
protected override void OnAuthorization(AuthorizationContext filterContext)
{
//enforce anti-forgery stuff for HttpVerbs.Post
if (String.Compare(filterContext.HttpContext.Request.HttpMethod, "post", true) == 0)
{
var authorize = new AuthorizeAttribute();
authorize.OnAuthorization(filterContext);
if (filterContext.Result != null) // Short circuit validation
return;
var forgery = new ValidateAntiForgeryTokenAttribute();
forgery.OnAuthorization(filterContext);
}
base.OnAuthorization(filterContext);
}
}
MVC कोड आधार के लिए कुछ संदर्भों:
ControllerActionInvoker#InvokeAuthorizationFilters()
लाइन 283. एक ही लघु सर्किटिंग। AntiForgeryData#GetUsername()
लाइन 98. नई कार्यक्षमता।
स्रोत
2010-03-29 14:53:40
यह समाधान एमवीसी 2 पर काम नहीं करने के लिए seams। यह एमवीसी 1 के लिए ठीक काम कर रहा है, लेकिन जैसे ही हमने v2 में अपग्रेड किया, यह काम करना बंद कर दिया।अब समाधान खोजने की कोशिश कर रहा है। –
इसे मेरे ध्यान में लाने के लिए धन्यवाद। मैं भी देखूँगा। – eduncan911
मुझे कम से कम _a_ समाधान मिला, शायद सबसे अच्छा नहीं। नीचे मेरा जवाब देखें। टिप्पणी बॉक्स कोड स्वरूपण के साथ बहुत अच्छा नहीं था =) –