5

को व्यक्तिगत उपयोगकर्ता खातों मैं माइक्रोसॉफ्ट खातों के साथ कार्य बाहरी प्रमाणीकरण पाने में कामयाब रहे है का उपयोग कर ASP.NET 5 वेब एप्लिकेशन खाका के साथ शुरू। उन लॉग इन पर क्लिक करते हैं कि वे इसपुनर्निर्देशन लॉग इन नियंत्रक कार्रवाई

<form asp-controller="Account" asp-action="ExternalLogin" method="post" asp-route-returnurl="@ViewData["ReturnUrl"]" class="nav navbar-right"> 
    <button type="submit" class="btn btn-null nav navbar-nav navbar-right" name="provider" value="Microsoft" title="Log in"><span class="fa fa-sign-in"/>&nbsp; Log In</button> 
</form> 

उन्हें उनके माइक्रोसॉफ्ट खाते का उपयोग में लॉग इन किया है और सभी अच्छी तरह से काम करने के लिए लगता है हो जाता है यही कारण है कि जैसे AccountController में ExternalLogin पर पुनः निर्देशित कर रहे हैं। लेकिन यह कैसे मैं इतना है कि उपयोगकर्ता ExternalLogin पर भेज दिया जाएगा विशेषाधिकार प्राप्त कार्यों [Authorize] उपयोग करने के लिए प्रत्यक्ष कोशिश में भी खलल करते हैं? क्या Startup.cs में डिफ़ॉल्ट कार्रवाई सेट की जा सकती है?

संपादित करें 1 @Yves की सलाह का पालन करने का प्रयास करते हुए मैंने फ़िल्टर फ़ोल्डर में CustomAutorizationFilter बनाया है। यह किसी भी स्थिति

public class CustomAutorizationFilter : IAuthorizationFilter 
{ 
    public void OnAuthorization(Microsoft.AspNet.Mvc.Filters.AuthorizationContext context) 
    { 
     //if (...) // Check you conditions here 
     //{ 
      context.Result = new RedirectToActionResult("ExternalLogin", "Account", null); 
     //} 
    } 
} 

जांच नहीं की जाती और

 services.AddMvc(config => 
     { 
      config.Filters.Add(typeof(Filters.CustomAutorizationFilter)); 
     }); 

नीचे के रूप में ConfigureServices संपादित किया है जब मैं अनुप्रयोग स्थानीय रूप से चलाने के यह अब होम पेज को जाता है। यह एक खाली http://localhost:52711/Account/ExternalLogin

रिटर्न जाहिर है बहुत मुझे समझ नहीं आता है।

संपादित करें 2: यहाँ ExternalLogin

// POST: /Account/ExternalLogin 
    [HttpPost] 
    [AllowAnonymous] 
    [ValidateAntiForgeryToken] 
    public IActionResult ExternalLogin(string provider, string returnUrl = null) 

के हस्ताक्षर है यह कैसे ExternalLogin ASP.Net 5 वेब एप्लिकेशन टेम्पलेट में बॉक्स से बाहर आता है।

+0

मुझे लगता है कि आपके संपादन के बाद एक रीडायरेक्ट लूप हो सकता है। 'AllowAnonymousAttribute' को अपने' बाहरी लॉग इन 'नियंत्रक में जोड़ने का प्रयास करें। अगर मुझे गलत नहीं लगता है कि विशेषता 'IAuthorizationFilter' को बाईपास करती है। क्या हो रहा है यह देखने के लिए आप इसे डीबग कर सकते हैं। मैं एक पीसी एटीएम पर नहीं हूँ। तो मैं इसे देख नहीं सकता। – Yves

+0

मैंने अपने प्रश्न में 'बाहरी लॉगिन' का हस्ताक्षर जोड़ा है। – Vague

+0

@Yves रीडायरेक्ट लूप के बारे में सही है। यह 'context.Result = new RedirectToActionResult (" बाहरी लॉगिन "," खाता ", शून्य) के माध्यम से लूपिंग रखता है; 'बाहरी लॉगिन' – Vague

उत्तर

2

क्योंकि मैं @Yves द्वारा सुझाए गए अनुसार CustomAuthorizationFilter काम करने में असमर्थ था, मैंने एक बुरा हैक का सहारा लिया है। मैं नीचे के रूप में AccountController Login संशोधित

 // GET: /Account/Login 
    [HttpGet] 
    [AllowAnonymous] 
    public IActionResult Login(string returnUrl = null) 
    { 
     ViewData["ReturnUrl"] = returnUrl; 
     return RedirectToAction(nameof(ExternalLogin), new { provider = "Microsoft", returnUrl = returnUrl }); 
     //return View(); 
    } 

यह काम करने के लिए लगता है, लेकिन अगर वहाँ एक बेहतर तरीका है मैं कोई राय या सलाह की सराहना करेंगे है।

3

आप इसे पूरा करने के लिए IAuthorizationFilter या IActionFilter कार्यान्वयन पंजीकृत कर सकते हैं। इन फिल्टर में आप देख सकते हैं कि अनुरोध, यदि उपयोगकर्ता में लॉग इन या यह करने के लिए पर्याप्त अनुमति है एक विशेषाधिकार प्राप्त कार्रवाई का उपयोग करने की कोशिश कर रहा है।

आप AutorizeAttribute का उपयोग कर रहे हैं, तो मैं सुझाव है कि आप AutorizationFilter उपयोग करने के लिए। आप अपने खुद के कस्टम विशेषताओं के साथ जाना है, तो ActionFilter का उपयोग करें।

यहाँ एक उदाहरण है:

MVC हर क्रिया क्रियान्वयन से पहले IAuthorizationFilter.OnAuthorization प्रणाली को बुलाती है।

public class CustomAuthorizationFilter : IAuthorizationFilter 
{ 
    public void OnAuthorization(Microsoft.AspNet.Mvc.Filters.AuthorizationContext context) 
    { 
     if (...) // Check you conditions here 
     { 
      context.Result = new RedirectToActionResult("ExternalLogin", "Account", null); 
     } 
    } 
} 

इस फिल्टर पंजीकृत करने के Startup.cs में अपने ConfigureServices विधि संपादित:

services.AddMvc(config => 
{ 
    config.Filters.Add(typeof(CustomAuthorizationFilter)); 
}); 

या आप अपनी खुद की विशेषताओं का उपयोग करने के लिए आप अगर सब कुछ है की जाँच करने के ActionFilter के OnActionExecuting विधि का उपयोग कर सकते हैं वान अगर जैसा चाहें हो रहा है ...

+0

पर कभी भी मारने के बिना @ Yves धन्यवाद। क्या स्थितियों की जांच की जाती है? क्या आप 'if (! User.Isuthorized)' जैसी चीज़ों के बारे में बात कर रहे हैं या क्या आपका मतलब कुछ और है? हमारा सेटअप बहुत आसान है; मैं सिर्फ यह जानना चाहता हूं कि वे लॉग इन हैं या यदि वे व्यवस्थापक भूमिका में हैं। – Vague

+0

यदि आप केवल उपयोगकर्ताओं में अनलॉक रीडायरेक्ट करना चाहते हैं तो 'IsAuthorized' मुझे लगता है कि पर्याप्त है। यह वास्तव में आपके व्यापार तर्क पर निर्भर करता है;) – Yves

+0

फिर से धन्यवाद @ Yves। मुझे अभी भी परिणाम नहीं मिल रहा है जिसके लिए मैं आशा करता हूं। मैंने आपकी सलाह का पालन करने के अपने प्रयास को शामिल करने के लिए अपना प्रश्न संपादित किया है। – Vague

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