2010-03-24 7 views
20

मुझे loginUrl पर रीडायरेक्ट करने के लिए [Authorize] पसंद है, जब तक कि मैं [Authorize (Roles="Admin")] जैसी भूमिका का उपयोग नहीं कर रहा हूं। उस स्थिति में, मैं बस एक पृष्ठ प्रदर्शित करना चाहता हूं कि उपयोगकर्ता अधिकृत नहीं है।केवल [urize] को लॉगिन करने के लिए कैसे करें जब केवल भूमिकाओं का उपयोग नहीं किया जाता है?

मुझे क्या करना चाहिए?

+0

मैं एक ही सवाल यहाँ से पूछा कि आपका AppSettings प्रविष्टि जोड़ने बनाने: http://stackoverflow.com/questions/2322366/how-do -आई-सर्विस-अप-अनधिकृत-पेज-जब-उपयोगकर्ता-न-इन-द-अधिकृत-भूमिकाएं –

+1

रॉबर्ट: धन्यवाद। मैंने पोस्ट करने से पहले समान पदों की खोज की, लेकिन आपका नहीं देखा। आप किस समाधान के साथ गए थे? – royco

+2

मैंने 'AuthorizeAttribute'' से कोड का उपयोग करके और इसे संशोधित करते हुए अपनी 'AuthorizeRoles' विशेषता रोलिंग समाप्त कर दी। यदि आप कल तक इंतजार कर सकते हैं, तो मैं कोड पोस्ट करूंगा। –

उत्तर

24

AuthorizeAttribute के मेरे संशोधित कार्यान्वयन से कोड यहां दिया गया है; मैंने इसे SecurityAttribute नाम दिया। केवल एक चीज है कि मैं बदल गया है OnAuthorization तरीका है, और URL अनधिकृत पृष्ठ पर रीडायरेक्ट करने के लिए मैं एक अतिरिक्त स्ट्रिंग संपत्ति कहा: कि वहाँ छोड़कर,

// Set default Unauthorized Page Url here 
private string _notifyUrl = "/Error/Unauthorized"; 

public string NotifyUrl { 
    get { return _notifyUrl; } set { _notifyUrl = value; } 
} 

public override void OnAuthorization(AuthorizationContext filterContext) { 
    if (filterContext == null) { 
     throw new ArgumentNullException("filterContext"); 
    } 

    if (AuthorizeCore(filterContext.HttpContext)) { 
     HttpCachePolicyBase cachePolicy = 
      filterContext.HttpContext.Response.Cache; 
     cachePolicy.SetProxyMaxAge(new TimeSpan(0)); 
     cachePolicy.AddValidationCallback(CacheValidateHandler, null); 
    } 

    /// This code added to support custom Unauthorized pages. 
    else if (filterContext.HttpContext.User.Identity.IsAuthenticated) 
    { 
     if (NotifyUrl != null) 
      filterContext.Result = new RedirectResult(NotifyUrl); 
     else 
      // Redirect to Login page. 
      HandleUnauthorizedRequest(filterContext); 
    } 
    /// End of additional code 
    else 
    { 
     // Redirect to Login page. 
     HandleUnauthorizedRequest(filterContext); 
    } 
} 

आप इसे मूल AuthorizeAttribute के रूप में एक ही तरह से फोन अनधिकृत पृष्ठ Url ओवरराइड करने के लिए एक अतिरिक्त संपत्ति है:

// Use custom Unauthorized page: 
[Security (Roles="Admin, User", NotifyUrl="/UnauthorizedPage")] 

// Use default Unauthorized page: 
[Security (Roles="Admin, User")] 
+0

धन्यवाद, यह अच्छी तरह से काम करता है। AuthorizeAttribute.cs को संशोधित करने के बजाय, मुझे बस इससे विरासत मिली। अब मैं [प्राधिकरण] के साथ भूमिकाओं का उपयोग कर सकता हूं और मेरा कोड बहुत सरल हो जाएगा। एक बार फिर धन्यवाद। – royco

+0

रॉबर्ट: मुझे AuthorizeCore के भीतर से हैंडलयूनाधिकृत रिक्वेस्ट (फ़िल्टरकॉन्टेक्स्ट) को कॉल करने की आवश्यकता है, जहां फ़िल्टरकॉन्टेक्स्ट उपलब्ध नहीं है। मैं फ़िल्टरकॉन्टेक्स्ट को AuthorizeCorext.HttpContext के पूर्णांक को एकीकृत कर सकता हूं। विचार? – royco

+0

@ बॉब: AuthorizeCore सिर्फ एक स्थानीय विधि है, इसलिए आपको जो भी चाहें वह करने में सक्षम होना चाहिए। –

3

मुझे मिला सबसे आसान तरीका AuthorizeAttribute को विस्तार और अनुकूलित करना है ताकि रोल चेक विफल होने पर यह कुछ अलग हो (यानी, एक HttpUnuthorizedResult सेट न करें)। मैंने अपने ब्लॉग पर इस बारे में article लिखा है कि आपको उपयोगी मिल सकता है। आलेख जो कुछ आप चाहते हैं उसका वर्णन करता है, हालांकि यह आगे जाता है और उपयोगकर्ता को डेटा का "मालिक" रखने की अनुमति देता है ताकि उसे कार्रवाई तक पहुंच मिल सके। मुझे लगता है कि यह आपके उद्देश्यों के लिए संशोधित करना काफी आसान होना चाहिए - आपको बस "या मालिक" भाग को हटाने की आवश्यकता होगी।

+0

केवल लिंक ही लिंक हैं क्योंकि यदि लिंक अब काम नहीं करता है, तो उत्तर बेकार हो जाता है, कृपया यहां दिए गए लिंक की सामग्री शामिल करें। –

+1

उत्तर मेरे ब्लॉग पोस्ट का संदर्भ देता है और सामान्य दृष्टिकोण का वर्णन करता है - और इस प्रकार यह "केवल लिंक" उत्तर नहीं है। मैं यहां पूरी पोस्ट को दोहराने की आवश्यकता को देखने में असफल रहा हूं। – tvanfosson

13

AuthorizeAttribute वर्ग का विस्तार और ओवरराइड HandleUnauthorizedRequest

public class RoleAuthorizeAttribute : AuthorizeAttribute 
{ 
    private string redirectUrl = ""; 
    public RoleAuthorizeAttribute() : base() 
    { 
    } 

    public RoleAuthorizeAttribute(string redirectUrl) : base() 
    { 
     this.redirectUrl = redirectUrl; 
    } 

    protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext) 
    { 
     if (filterContext.HttpContext.Request.IsAuthenticated) 
     { 
      string authUrl = this.redirectUrl; //passed from attribute 

      //if null, get it from config 
      if (String.IsNullOrEmpty(authUrl)) 
       authUrl = System.Web.Configuration.WebConfigurationManager.AppSettings["RolesAuthRedirectUrl"]; 

      if (!String.IsNullOrEmpty(authUrl)) 
       filterContext.HttpContext.Response.Redirect(authUrl); 
     } 

     //else do normal process 
     base.HandleUnauthorizedRequest(filterContext); 
    } 
} 

प्रयोग

[RoleAuthorize(Roles = "Admin, Editor")] 
public class AccountController : Controller 
{ 

} 

और सुनिश्चित करें कि आप config

<appSettings> 
    <add key="RolesAuthRedirectUrl" value="http://mysite/myauthorizedpage" /> 
</appSettings> 
संबंधित मुद्दे

 संबंधित मुद्दे