2015-10-07 22 views
8

मैंने पहले से ही एक एमवीसी वेबएपीआई परियोजना बनाई है और अब मैं प्रमाणीकरण और प्रमाणीकरण का उपयोग करना चाहता हूं। मुझे लगता है कि मैंने पहले से ही इस सुरक्षा को लागू किया है, लेकिन किसी कारण से कुछ बुरा हो जाता है, जब मैं अपने प्रमाण पत्र लिखता हूं और मैं कुछ वेब एपीआई तरीकों को कॉल करने का प्रयास करता हूं, तो संदेश "इस अनुरोध के लिए प्राधिकरण से इनकार कर दिया गया है" दिखाया गया है।प्राधिकरण अस्वीकार कर दिया गया है। हमेशा

यह वह कोड है जिसे मैंने कार्यान्वित किया था।

WebApiConfig:

public static void Register(HttpConfiguration config) 
    { 
     // Web API configuration and services 

     // Web API routes 
     config.MapHttpAttributeRoutes(); 

     config.Routes.MapHttpRoute(
      name: "DefaultApi", 
      routeTemplate: "api/{controller}/{id}", 
      defaults: new { id = RouteParameter.Optional } 
     ); 

     config.Filters.Add(new AuthorizeAttribute()); 
    } 

रूटिंग कॉन्फ़िग:

public static void RegisterRoutes(RouteCollection routes) 
    { 
     routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 

     routes.MapRoute(
      name: "Default", 
      url: "{controller}/{action}/{id}", 
      defaults: new { controller = "Routing", action = "LogIn", id = UrlParameter.Optional } 
     ); 
    } 

नियंत्रक:

public class RoutingController : Controller 
{ 
    // 
    // GET: /Routing/ 
    public ActionResult Index() 
    { 
     return View(); 
    } 

    public ActionResult Projects() 
    { 
     return View(); 
    } 

    public ActionResult Users() 
    { 
     return View(); 
    } 

    public ActionResult LogIn() 
    { 
     return View(); 
    } 

    [HttpPost] 
    public JsonResult LogInPost(string userName, string password) 
    { 
     User user = new User(); 
     RoleByUser rByU = new RoleByUser(); 
     password = UserController.EncriptPassword(password); 
     string url = string.Empty; 
     var checkUser = user.Get(userName); 
     var userExists = (from userInList in checkUser where userInList.UserName == userName && userInList.Password == password select userInList).FirstOrDefault(); 
     if(userExists!= null) 
     { 
      var roles = (from roleByUser in userExists.listOfRole select roleByUser.RoleName.Trim()).ToArray(); 
      IPrincipal principal = new GenericPrincipal(
      new GenericIdentity(userExists.UserName), roles); 
      SetPrincipal(principal); 
      url = "Routing/Users"; 
     } 
     return Json(url); 
    } 

    private void SetPrincipal(IPrincipal principal) 
    { 
     Thread.CurrentPrincipal = principal; 
     if (System.Web.HttpContext.Current != null) 
     { 
      System.Web.HttpContext.Current.User = principal; 
     } 
    } 

} 

HTML:

<link href="~/css/Style.css" rel="stylesheet" type="text/css" /> 

<div class="container"> 
    <div class="card card-container"> 
     <img id="STK" class="profile-img-card" src="Images/Softtek.png" /> 
     <p id="profile-name" class="profile-name-card"></p> 
     <form class="form-signin"> 
      <span id="reauth-email" class="reauth-email"></span> 
      <input type="text" id="txtUserName" class="form-control" placeholder="Email address" required autofocus /> 
      <input type="password" id="txtPassword" class="form-control" placeholder="Password" required /> 
      <div id="remember" class="checkbox"> 
       <label> 
        <input type="checkbox" value="remember-me" /> Remember me 
       </label> 
      </div> 
      @*<button id="btnLogIn" class="btn btn-lg btn-primary btn-block btn-signin" >Sing In</button>*@ 
     </form><!-- /form --> 
     <button id="btnLogIn" class="btn btn-lg btn-primary">Sing In</button> 
     <a href="#" class="forgot-password"> 
      Forgot the password? 
     </a> 
    </div><!-- /card-container --> 
</div><!-- /container --> 

जे एस:।

$ (document) .ready (function() { $ ('# btnLogIn') पर क्लिक करें (प्रवेश); });

function logIn() { 
    $.ajax({ 
     type: "POST", 
     url: "http://localhost:21294/Routing/LogInPost", 
     dataType: "json", 
     data: { userName: $('#txtUserName').val(), password: $('#txtPassword').val() }, 
     success: function (data) { 
      if(data!= "" && data!= undefined && data!= null) 
       window.location.href = data; 
     }, 
     error: function (err, e, error) { 
      toastr.error('Error') 
     } 
    }); 

उत्तर

11

आप को [AllowAnonymous] विशेषता जोड़ना चाहिए आपके नियंत्रक LogInPost

जब आप अपने फिल्टर को AuthorizeAttribute कहा, यह कारण अपने नियंत्रकों वे सभी कार्यों के लिए डिफ़ॉल्ट रूप से प्राधिकरण की आवश्यकता, एक सहित ग्रहण करने के लिए लॉगिन करने के लिए प्रयोग किया जाता है।

+0

मुझे लगता है कि समस्या यह है कि मैं थ्रेड को लागू कर रहा हूं। वर्तमान प्रिंसिपल और Current.User, क्योंकि अगर मैं अपने एपीआई नियंत्रक में विशेषता [AllowAnonymous] जोड़ता हूं तो ऐप ठीक काम करता है, लेकिन अगर मैं विशेषता जोड़ता हूं [प्राधिकरण (भूमिकाएं = रोलइन्टिटी .Collaborator)] उदाहरण के लिए आवेदन इस भूमिका को पहचान नहीं है। इसलिए मुझे लगता है कि मुझे दूसरी जगह या किसी अन्य तरीके से वर्तमान प्रिंसिपल को लागू करना चाहिए, क्या आपको पता है कि मुझे कहां इम्प्लांट करना चाहिए? – user3442776

+0

यह देर से प्रतिक्रिया है, लेकिन यदि उपयोगकर्ता ने अभी तक प्रमाणीकृत नहीं किया है तो आप भूमिका के लिए अधिकृत करने की कार्रवाई के लिए कैसे उम्मीद कर सकते हैं? –

3

क्या आप विंडोज प्रमाणीकरण कर रहे हैं? क्या आपको "एक्सेस अस्वीकृत" त्रुटि मिल रही है?

कभी-कभी IISEXpress और आईआईएस कुछ चाल करता है और उस पर काबू पाने के लिए मैंने स्थानीय आईआईएस (inetmgr) में साइट होस्ट की है, प्रमाणीकरण (लागू होने पर विंडोज़) सक्षम करें और अब इसे चलाएं।

पीएस सभी मशीनों में डिफ़ॉल्ट रूप से आईआईएस सर्वर स्थापित नहीं होता है, इसलिए यदि inetmgr काम नहीं करता है तो आपको इसे नियंत्रण कक्ष -> विंडोज फीचर्स -> आईआईएस और एएसपी की सभी सुविधाओं का चयन करना होगा .नेट

आशा है कि यह इच्छा होगी मदद।

+0

मैं अपना खुद का प्रमाणीकरण लागू कर रहा हूं और मुझे यह त्रुटि मिल रही है "इस अनुरोध के लिए प्राधिकरण को अस्वीकार कर दिया गया है"। मुझे लगता है कि ऐसा इसलिए है क्योंकि मुझे मौजूदा प्रिंसिपल को अन्य जगहों पर लागू करना चाहिए, क्या आपको पता है कि मुझे कहां करना चाहिए? – user3442776

2

इतनी देर से प्रतिक्रिया के लिए खेद है - मुझे आपका प्रश्न मिला क्योंकि आईआईएस-होस्टेड वेब एपीआई से एक स्वयं-होस्ट किए गए वेब एपीआई में स्विच किया गया है, मैंने अभी भी एक ही समस्या का अनुभव करना शुरू कर दिया है।

मेरे मामले में, समस्या थ्रेड.क्रोरेंट प्रिंसिपल को शुरू करने के तरीके के कारण हुई थी। कुछ पृष्ठभूमि:

  1. मैं, एक कस्टम AuthenticationHandler (DelegationHandler से इनहेरिट)
  2. इस हैंडलर में उपयोग कर रहा हूँ मैं कुछ कस्टम उपयोगकर्ता सत्यापन करने के लिए SendAsync विधि अधिभावी कर रहा हूँ।
  3. यदि सत्यापन सफल होता है, तो मैं वर्तमान उपयोगकर्ता के बारे में कुछ दावों के लिए दावा प्रिंसिपल क्लास का एक उदाहरण बना देता हूं।

पहले, मैं पाइपलाइन में शेष संदेश हैंडलरों को आगे संदेश भेजने से पहले इस दावे प्रिंसिपल इंस्टेंस को थ्रेड। कंटेंट प्रिंसिपल को असाइन कर रहा था। हालांकि, मेरे लिए समाधान का उपयोग प्रिंसिपल सदस्य को HttpRequestContext उदाहरण पर करना था जो HttpRequestMessage इंस्टेंस से संबंधित है जो SendAsync को पास किया गया है। इसलिए (एफ # में),

override this.SendAsync(request : HttpRequestMessage, cancellationToken : CancellationToken) = 
    // Do some user validation here first 
    // .. then setup the claims (method details omitted) 
    let principal = BuildClaimsPrincipal 

    // Assign to Principal on HttpRequestContext 
    let requestContext = request.GetRequestContext 
    requestContext.Principal <- principal 

    // Rest of method omitted... 

आशा है कि यह आपको किसी भी तरह से मदद करने में सक्षम है।

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