2016-06-24 9 views
8

के साथ प्रोजेक्ट बनाया गया है तो मुझे पहचान के साथ कोई समस्या है और मैं इससे बहुत परिचित नहीं हूं। बहुत समय पहले मैंने एक नई परियोजना शुरू की थी जिसका मूल रूप से इसका कोई प्रमाणीकरण नहीं था। हालांकि, जैसे ही परियोजना बढ़ी, हमने पाया कि हमें इसे लागू करना चाहिए। चूंकि इसे मूल रूप से स्थापित नहीं किया गया था इसलिए मैंने लॉगिन के लिए एक फॉर्म बनाया था। लेकिन यह काम नहीं कर रहाएएसपी.NET पहचान एकीकरण जब कोई प्रमाणीकरण

How to implement custom authentication in ASP.NET MVC 5

और मैं पता नहीं क्यों:

मैं इस सवाल का जवाब मिल गया है और इसे लागू किया।

यहां देखने को कुछ यह सिर्फ एक सादे रूप है बहुत:

यहाँ मेरी कोड है।

@{ 
    ViewBag.Title = "Login"; 
} 

<div class="container"> 

<h2>Login</h2> 

<br /> 

@using (Html.BeginForm("Login", "Main")) 
{ 
    <div class="row"> 
     <div class="form-group col-xs-6"> 
      @Html.Label("Username", htmlAttributes: new { @class = "control-label col-sm-3" }) 
      <div class="col-sm-8"> 
       @Html.TextBox("username", null, new { @class = "form-control" }) 
       @*Html.ValidationMessageFor(model => model.EnrollmentOption, "", new { @class = "text-danger" })*@ 
      </div> 
     </div> 

     <div class="form-group col-xs-6"> 
     </div> 

    </div> 

    <div class="row"> 
     <div class="form-group col-xs-6"> 
      @Html.Label("Password", htmlAttributes: new { @class = "control-label col-sm-3" }) 
      <div class="col-sm-8"> 
       @Html.Password("password", null, new { @class = "form-control" }) 
       @*Html.ValidationMessageFor(model => model.EffectiveDate, "", new { @class = "text-danger" })*@ 
      </div> 
     </div> 

     <div class="form-group col-xs-6"> 
     </div> 

    </div> 

    <div class="row"> 
     <div class="form-group"> 
      <div class="col-md-offset-6 col-sm-5"> 
       <input type="submit" id="login" value="Sign in" class="btn btn-primary" /> 
      </div> 
     </div> 
    </div> 
} 

कार्रवाई इसके लिए लागू किया इस एक, कि ज़्यादा से ज़्यादा मायने रखती है:

[HttpPost] 
    public ActionResult Login(string username, string password) 
    { 
     if (isLoginValid(username, password)) 
     { 
      var ident = new ClaimsIdentity(
       new[] { 
      // adding following 2 claim just for supporting default antiforgery provider 
      new Claim(ClaimTypes.NameIdentifier, username), 
      new Claim("http://schemas.microsoft.com/accesscontrolservice/2010/07/claims/identityprovider", "ASP.NET Identity", "http://www.w3.org/2001/XMLSchema#string"), 

      new Claim(ClaimTypes.Name,username), 

      // No roles needed for now... 
       }, 
       DefaultAuthenticationTypes.ApplicationCookie); 

      HttpContext.GetOwinContext().Authentication.SignIn(
       new AuthenticationProperties { IsPersistent = false }, ident); 
      return RedirectToAction("QuoteSearch"); // auth succeed 
     } 
     else 
     { 
      // invalid username or password 
      ModelState.AddModelError("", "Invalid username or password"); 
      return View(); 
     } 
    } 

और वहाँ isLoginValid समारोह है (अब यह एक हार्डकोडेड लॉगिन का उपयोग करने के लिए सेट है के लिए)

[NonAction] 
    private bool isLoginValid(string user, string password) 
    { 
     return (user.ToLower() == "someUser" && password.ToLower() == "myPassword"); 
    } 

मुझे बहुत से दावों या पहचान के नीचे कैसे काम नहीं पता है। मैंने हालांकि सभी आवश्यक संदर्भ जोड़ने के बारे में सुनिश्चित किया था। लॉगिन रीडायरेक्ट के बाद मेरे कार्यों पर प्राधिकृत विशेषता का उपयोग करते समय मुझे आईआईएस से अनधिकृत अनुरोध मिलता है। क्या मेरे कोड में कुछ गड़बड़ है?

मुझे पहचान के प्राधिकरण भाग का उपयोग करने में सक्षम होने के लिए क्या बदलना चाहिए या ठीक करना चाहिए?

धन्यवाद,

+0

स्थापित करने की आवश्यकता यह जानना चाहता है कि, कृपया कम से कम एक टिप्पणी छोड़ अच्छा होगा। –

+2

अपनी स्टार्टअप सीएस फ़ाइल की जांच करें, आपके पास सेवाओं के लिए कॉल होना चाहिए। कॉन्फ़िगर सर्विसेज विधि में जोड़ें (...), और इसी तरह कॉन्फ़िगर विधि में ऐप के लिए कॉल होना चाहिए। उपयोग (i)। मेरा सुझाव नमूना ऐप को प्रमाणीकरण के साथ उत्पन्न करना और आपके पास जो कुछ है उसके साथ तुलना करना है। लेकिन ऐसा लगता है कि आपके पास इंजेक्शन वाली सेवाएं नहीं हैं। – guysherman

+0

@guysherman एएसपी.Net कोर के लिए है, एमवीसी 5 के लिए नहीं, जो इस सवाल के बारे में है। – DavidG

उत्तर

5

कुछ समस्या निवारण के बाद और guysherman की टिप्पणी के लिए धन्यवाद मैं समाधान खोजने के लिए सक्षम था। चूंकि मैंने बिना किसी प्रमाणीकरण के समाधान को बनाया है, इसलिए मैंने अपने App_Start फ़ोल्डर में संदर्भों और आवश्यक OWIN कॉन्फ़िगरेशन कोड को शामिल किया है।

इस वजह से, पहचान में कुछ भी परिभाषित नहीं किया गया था और प्रमाणीकरण भाग से कुछ भी इस तथ्य के बावजूद हुआ कि लॉगिन पूरी तरह से काम कर रहा था। एक नई परियोजना बनाकर और पहचान को कॉन्फ़िगर करने के लिए सभी आवश्यक कोड जोड़कर, मैं प्राधिकृत विशेषता का सही ढंग से उपयोग करने में सक्षम था। बिना किसी समस्या के।

(इस उत्तर ASP.NET 4.6 के लिए लागू होता है, मुझे लगता है इस ASP.NET कोर के लिए अलग तरह से नियंत्रित किया जाता है)

अद्यतन:

मैंने सोचा कि मैं क्या में और अधिक विस्तार से बता देना चाहिए बेहतर इस जवाब बनाने के लिए मैं इसे काम करने के लिए किया था।

पहचान के साथ एक नई परियोजना बनाते समय आप देखेंगे कि कई फाइलें नहीं बनाई गई हैं जिन्हें आप इसे नहीं जोड़ना चाहते हैं, तो आपको उन लोगों की आवश्यकता होगी, उनमें से अधिकतर App_Start में संग्रहीत हैं।

App_Start for a normal ASP.NET Project

मुझे लगता है मैं नहीं था फ़ाइलों की नकल की और अपने वास्तविक परियोजना मैच के लिए नामस्थान बदल दिया है। एक बार ऐसा करने के बाद यह स्पष्ट किया गया कि मैं कौन सा नुजेट पैकेज खो रहा था, इसलिए मैंने उन लोगों को जोड़ा जिन्हें मैंने अभी तक नहीं जोड़ा था।पहचान के लिए काम करने के लिए

Startup.Auth.cs एक महत्वपूर्ण समारोह के लिए परिभाषा होगा:

ConfigureAuth

इस समारोह स्टार्टअप कक्षा में बुलाया जाना चाहिए। विन्यास विधि में।

enter image description here

enter image description here

अंत में, सब कुछ काम करने के लिए, आप भी फ़ाइल IdentityModel.cs कि सामान्य रूप से मॉडल फ़ोल्डर के अंदर बनाई गई है शामिल करना चाहिए। मेरे मामले में, मैंने सभी मॉडलों को एक अलग परियोजना में रखा, इसलिए मैंने कक्षा को वहां रखा और IdentityConfig.cs पर संदर्भ जोड़े ताकि कक्षा पहचान सके कि पहचान मॉडल मौजूद है।

enter image description here

और वह सब था। मेरे मामले में मुझे उपयोगकर्ताओं की तलाश करने के लिए डीबी से कनेक्ट करने की कोशिश करने वाली पहचान के साथ बहुत सी समस्याएं थीं, क्योंकि पहचान में डेटाबेस कॉन्फ़िगर नहीं किया गया था, असफल डीबी कनेक्शन के कारण मेरा ऐप क्रैश हो गया। तीसरी छवि में लाल रंग के साथ चिह्नित रेखाओं को हटाने से यह मेरे लिए काम करता है। मैं पहचान का डीबी कनेक्शन नहीं चाहता था क्योंकि मेरे पास अपना खुद का उपयोगकर्ता हैंडलिंग है, यह किसी और का मामला नहीं हो सकता है।

+2

FWIW, इस तरह की स्थितियों में, सबसे अच्छी बात यह है कि * व्यक्तिगत लेख के साथ बस एक नया प्रोजेक्ट बनाएं, और फिर अपने आवेदन में आवश्यक कोड पर प्रतिलिपि बनाएँ। इस तरह, आप इस तरह की चीजों को याद नहीं करते हैं। एक संदर्भ परियोजना के बिना पहचान की तरह कुछ स्थापित करना बहुत मुश्किल है। –

+1

यही वह है जो मैं अंत में कर रहा था, शायद मुझे अपने जवाब में स्पष्ट करना चाहिए। –

1

विस्तृत उत्तर के लिए @ कैरलोस के लिए बहुत डीबगिंग और धन्यवाद के बाद। यदि आपकी प्रोजेक्ट "नो प्रमाणीकरण" के साथ बनाई गई है, तो आपको प्रमाणीकरण की आवश्यकता वाले अनुपलब्ध Nuget संकुल को जोड़ना होगा।

आप नापसंद देखते हैं, तो निम्न

Microsoft.AspNet.Identity 
Microsoft.AspNet.Identity.EntityFramework 
Microsoft.AspNet.Identity.Owin 
Microsoft.Owin.Host.SystemWeb 
Microsoft.Owin.Security 
संबंधित मुद्दे