ASP.NET पहचान - HttpContext में GetOwinContext के लिए कोई एक्सटेंशन विधि नहीं है


384

मैंने यहां से ASP.NET आइडेंटिटी सैंपल को डाउनलोड किया और सफलतापूर्वक चलाया: https://github.com/rustd/AspnetIditity.ample

अब मैं अपने प्रोजेक्ट में ASP.NET आइडेंटिटी फ्रेमवर्क को लागू करने के बीच में हूं और एक समस्या में भाग गया हूं, जिसने मुझे पागल बना दिया है ...

GetOwinContext() मेरे पर एक विस्तार विधि के रूप में मौजूद नहीं है HttpContext

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

मैंने अपने नियंत्रक में समान कोड को लागू करने का प्रयास किया है, और उसी समस्या का पता लगाता हूं।

मुझे स्पष्ट रूप से एक संदर्भ याद आ रहा है, हालांकि मुझे नहीं पता कि क्या है ..!

कोड-ब्लॉक जो मुझे मार रहा है वह है:

private IAuthenticationManager AuthenticationManager
{
    get
    {
        return HttpContext.GetOwinContext().Authentication;
    }
}

मैंने निम्नलिखित संदर्भों को जोड़ा है - मेरी कक्षा पुस्तकालय में इन दोनों की कोशिश की और नियंत्रक पर भी निर्देशित किया, उनमें से कोई भी मेरे लिए काम नहीं करता है ...

using Microsoft.AspNet.Identity;
using Microsoft.AspNet.Identity.EntityFramework;
using Microsoft.Owin.Security;
using Microsoft.Owin;
using System.Web;

... यह मुझे दीवार पर चला रहा है .... कोई विचार?

अपडेट करें

मैंने नमूने में आइडेंटिटी और OWIN के संस्करणों की जांच की है, और मैंने यह सुनिश्चित किया है कि मेरे समाधान में समान संस्करण हैं।

इससे अधिक, यदि मैं नमूने के लिए वस्तु ब्राउजर को खोजता हूं, तो मैं GetOwinContextविधि खोज सकता हूं, हालांकि जब मैं अपने समाधान में इसे खोजता हूं तो यह कहीं नहीं पाया जाता ... मेरे पास कुछ लाइब्रेरी होनी चाहिए, लेकिन मैं कर सकता हूं ' t इसे खोजो!

जवाबों:


712

आह!

मैंने पाया कि ... मेरे पास एक अतिरिक्त पैकेज नहीं है, जिसे कहा जाता हैMicrosoft.Owin.Host.SystemWeb

एक बार जब मैंने इसे खोजा और स्थापित किया, तो यह काम कर गया।

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

EDIT हालांकि यह Microsoft.Owin.Host.SystemWebअसेंबली में है यह System.Webनामस्थान में एक विस्तार विधि है , इसलिए आपको पूर्व का संदर्भ होना चाहिए, और usingबाद का होना चाहिए ।


6
पता लगाने के लिए धन्यवाद कि एक: मैं इस ट्यूटोरियल का उपयोग कर रहा हूँ asp.net/identity/overview/getting-started/… और यह एक लापता कदम है
फ्रेंची

23
@tne - आपकी टिप्पणी के लिए धन्यवाद ... हालांकि मैं मुश्किल से 'लक्ष्यहीन रूप से इधर-उधर भाग रहा था' - मैं एक विश्वसनीय संसाधन से एक ट्यूटोरियल का अनुसरण कर रहा था; asp.net साइट से कोई कम नहीं। उनके पास अपने ट्यूटोरियल में यह कदम नहीं था (यह तब से जोड़ा गया है) - भी, तथ्य यह है कि लोग इस उत्तर को दोनों को उभार रहे हैं और मूल क्यू यह भी इंगित करने के लिए जाता है कि मैं इस मुद्दे के साथ एकमात्र नहीं था।
डेरेन वेनराइट 12

5
@ डेरेन, काफी निष्पक्ष। (मुझे पता है कि मैं अलग ढंग से शब्दों में हो सकता था।)
tne


5
पता नहीं कि यह इस संदर्भ को अद्यतन करने से था, लेकिन मुझे अपने असाइनमेंट को थोड़ा बदलना पड़ा var authenticationManager = HttpContext.Current.GetOwinContext().Authentication;(वर्तमान में जहां यह प्रश्न में नहीं था, वहां शामिल है)।
ओरतुंड

177

मेरा मानना ​​है कि HttpContextयदि आप नियंत्रक से बाहर हैं, तो आपको वर्तमान का संदर्भ देना होगा । MVC नियंत्रकों में वर्तमान संदर्भ का आधार संदर्भ होता है। हालाँकि, इसके बाहर, आपको स्पष्ट रूप से यह घोषित करना होगा कि आप वर्तमान चाहते हैंHttpContext

return HttpContext.Current.GetOwinContext().Authentication;

जैसा कि यह नहीं दिखा रहा है, एक नया MVC 5 प्रोजेक्ट टेम्प्लेट जो आपके ऊपर दिखाए गए कोड का उपयोग कर रहा है ( IAuthenticationManagerखाता नियंत्रक के शीर्ष पर बयानों का उपयोग करके निम्नलिखित है:

using System.Threading.Tasks;
using System.Web;
using System.Web.Mvc;
using Microsoft.AspNet.Identity;
using Microsoft.AspNet.Identity.EntityFramework;
using Microsoft.Owin.Security;
using WebApplication2.Models;

हर एक पर टिप्पणी करते हुए, यह GetOwinContext()वास्तव में System.Web.Mvc विधानसभा का एक हिस्सा है।


यह कोशिश कर रहा है और बस यह नहीं मिल सकता है। - GetOwinContext () का मतलब है।
डैरेन वेनराइट

2
@ डारेन - मैंने नमूना टेम्प्लेट के साथ थोड़ा सा खेला और आपकी असेंबली गायब हो सकती है। ऐसा लगता है कि आपको System.Web.Mvcअपनी कक्षा परियोजना से संदर्भ लेने की आवश्यकता होगी । जब टिप्पणी की गई, तो जो HttpContext.GetOwinContext()अज्ञात हो गया है (और Microsoft.Owin.Securityविधानसभा नहीं )
टॉमी

मैं एक नियंत्रक पर सीधे काम करने के लिए इसे पाने के लिए कोशिश कर रहा हूँ - और फिर इसे नहीं पा सकता।
डैरेन वेनराइट

19
इसने मुझे उलझा दिया। वर्ग HttpContextपर एक सार्वजनिक संपत्ति होती है Controller, इसलिए यदि आप उससे विरासत में लेते हैं, तो HttpContext.GetOwinContext()उम्मीद के मुताबिक काम करता है। यदि आप से विरासत में लेते हैं ApiController, तो ऐसी कोई संपत्ति नहीं है। इसलिए, HttpContextकक्षा को संदर्भित करेगा, जिसके लिए आपको Currentकक्षा के एक उदाहरण का उपयोग करने की आवश्यकता होगी । इसलिए यदि आप एक नियंत्रक से ApiController के लिए कोड कॉपी / पेस्ट करते हैं और आश्चर्य करते हैं कि यह काम क्यों नहीं करता है, तो यह आपके लिए जवाब है।
डेविड मियां

"वर्तमान में मेरे लिए गोत्र था
क्लिक करें ठीक है

24

परीक्षण और त्रुटि के बाद मेरे नियंत्रक और Asp.Net टेम्पलेट नियंत्रक के उपयोग के बयानों की तुलना करना

using System.Web;

मेरे लिए समस्या का समाधान किया। आपको भी जोड़ने की आवश्यकता है:

using Microsoft.AspNet.Identity;
using Microsoft.AspNet.Identity.Owin;

GetUserManager विधि का उपयोग करने के लिए।

Microsoft इसे सही क्लिक के साथ स्वचालित रूप से हल करने और बयानों का उपयोग कर अन्य लापता की तरह हल करने का तरीका नहीं खोज सका?


1
यह मेरे लिए भी काम किया। मेरे पास पहले से आइडेंटिटी लाइब्रेरी थी, लेकिन लगता है कि System.Web की जरूरत है।
दक्षिणशोर

1
यह स्पष्ट रूप से बहुत कुछ के आसपास घूम रहा है, दोनों विधानसभाओं और नाम स्थान में। यह वास्तव में एक विस्तार विधि होने के साथ दर्दनाक बनाता है। मैंने अपने सभी पुस्तकालयों को अपडेट कर दिया है और यह उत्तर दर्शाता है कि यह वर्तमान में कहां है।
शैनन

आह, तु राजभाषा 'dll नरक एक नए आकार में
JustJohn

1
हां, दुख की बात है कि विस्तार के तरीकों को स्वचालित रूप से हल नहीं किया जा सकता है।
रॉनन फिस्टिंगर 16

22

मेरे मामले में Microsoft.AspNet.WebApi.Owin संदर्भ को nuget के माध्यम से जोड़ने ने चाल चली।


हां, यह मेरे लिए वर्तमान नवीनतम संस्करण पर किया गया था। विस्तार पैकेज इस पैकेज में है, जो कि Assemby System.Web.Http.Owin है और Namespace System.Net.Http के
oatsoda

16

सुनिश्चित करें कि आपने नगेट पैकेज स्थापित किया है Microsoft.AspNet.Identity.Owin। फिर System.Net.Httpनाम स्थान जोड़ें ।


मेरे पास वह भी था। पहचान सामान स्थापित होने पर एक और पुस्तकालय स्थापित नहीं था।
डैरेन वेनराइट

@ डैरेन कृपया पैकेज का नाम जोड़ें। धन्यवाद
शनि टेक्नोलॉजीज

6
@SaturnTechnologies मेरे लिए, दूसरा पैकेज Microsoft था। Microsoft.ost.ost.SystemWeb और namespace System.Web
WiSeeker 25'17

1
मैं दूसरा वाईसेकर। मेरे लिए, यह मदद नहीं की। डैरेन के स्थापित करने के सुझाव Microsoft.Owin.Host.SystemWebने हालांकि चाल चली।
मैक्स बैराक्लो


10

वेब एपीआई प्रोजेक्ट में देवों को यह त्रुटि मिल रही है -

GetOwinContext एक्सटेंशन पद्धति को System.Web.Http.Owindll में परिभाषित किया गया है और एक और पैकेज की आवश्यकता होगी Microsoft.Owin.Host.SystemWeb। इस पैकेज को आपके प्रोजेक्ट में nuget से इंस्टॉल करने की आवश्यकता है।

पैकेज से लिंक करें : OWIN पैकेज इंस्टॉल कमांड -

Install-Package Microsoft.AspNet.WebApi.Owin    

System.web पैकेज से लिंक करें: पैकेज इंस्टॉल कमांड -

Install-Package Microsoft.Owin.Host.SystemWeb

इस त्रुटि को हल करने के लिए आपको यह जानने की आवश्यकता है कि आपके मामले में ऐसा क्यों हो रहा है। कृपया अपने कोड में बिंदुओं के नीचे क्रॉस चेक करें -

  1. आपके पास संदर्भ होना चाहिए Microsoft.AspNet.Identity.Owin;

    Microsoft.AspNet.Identity.Owin का उपयोग कर;

  2. GetOwinContext()नीचे के HttpContext.Currentरूप में परिभाषित करें -

     return _userManager1 ?? HttpContext.Current.GetOwinContext().GetUserManager<ApplicationUserManager>();

    या

    return _signInManager ?? HttpContext.Current.GetOwinContext().Get<ApplicationSignInManager>();

पूरा कोड जहां GetOwinContext () का उपयोग किया जाता है -

 public ApplicationSignInManager SignInManager
 {
   get
   {
    return _signInManager ?? HttpContext.Current.GetOwinContext().Get<ApplicationSignInManager>();
   }
    private set
    {
     _signInManager = value;
    }
  }

Namespace's का उपयोग मैं कोड फ़ाइल में कर रहा हूँ जहाँ GetOwinContext () का उपयोग किया जाता है

using AngularJSAuthentication.API.Entities;
using AngularJSAuthentication.API.Models;
using HomeCinema.Common;
using Microsoft.AspNet.Identity;
using Microsoft.AspNet.Identity.EntityFramework;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using System.Web;
using Microsoft.AspNet.Identity.Owin;
using Microsoft.Owin.Security.DataProtection;

मुझे अपने कोड को अपनी एक परियोजना से दूसरी परियोजना में ले जाते समय यह त्रुटि मिली।


4

API में UserManager पाने के लिए

return HttpContext.Current.GetOwinContext().GetUserManager<AppUserManager>();

जहाँ AppUserManager वह वर्ग है जो UserManager से विरासत में मिला है।


4

मेरे पास सभी सही पैकेज और usings थे, लेकिन मुझे GetOwinContext()काम करने से पहले पहले निर्माण करना पड़ा ।


पहली बार काम करने के लिए आपने अपना निर्माण कैसे तय किया?
नॉर्ड्स

@ नॉर्ड्स कभी-कभी वीएस बैकग्राउंड में निर्माण करने में विफल रहता है (यानी: यह बताता है कि संकलन में त्रुटियां हैं), लेकिन एक वास्तविक बिल्ड को ट्रिगर करना (या अधिक बार साफ और फिर निर्माण) इसे प्राप्त करेगा। संभावना है कि केविन क्या अनुभव कर रहा था।
Maverick

0

बस इस पैकेज को स्थापित करें और आपका कोड काम करेगा: => इंस्टाल-पैकेज Microsoft.Owin.Host.SystemWeb -Version 2.1.0

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.