ASP.NET Identity - HttpContext ไม่มีวิธีการขยายสำหรับ GetOwinContext


384

ฉันได้ดาวน์โหลดและรันตัวอย่าง ASP.NET Identity ได้สำเร็จจากที่นี่: https://github.com/rustd/AspnetIdentitySample

ตอนนี้ฉันกำลังใช้กรอบงาน ASP.NET Identity ในโครงการของฉันและพบปัญหาซึ่งทำให้ฉันเป็นบ้าตลอดทั้งวัน ...

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;

... นี่ทำให้ฉันติดกำแพง .... มีความคิดอะไรบ้าง

UPDATE

ฉันได้ตรวจสอบเวอร์ชั่นของ Identity & OWIN ในตัวอย่างแล้วและตรวจสอบให้แน่ใจว่าฉันมีเวอร์ชันเดียวกันในโซลูชันของฉัน

ยิ่งกว่านั้นถ้าฉันค้นหาเบราว์เซอร์วัตถุบนตัวอย่างGetOwinContextฉันสามารถหาวิธีได้ แต่เมื่อฉันค้นหาในโซลูชันของฉันมันไม่พบที่ไหนเลย ... ฉันต้องมีห้องสมุดเก่า ๆ แต่ฉันสามารถ ' หามันไม่เจอ!

คำตอบ:


713

โอ๊ะ!

ฉันพบมัน ... ฉันไม่มีแพ็คเกจพิเศษเรียกว่าMicrosoft.Owin.Host.SystemWeb

เมื่อฉันค้นหาและติดตั้งสิ่งนี้มันทำงาน

ตอนนี้ - ฉันไม่แน่ใจว่าฉันเพิ่งพลาดทุกอย่างไป แต่ก็ไม่พบการอ้างอิงถึงไลบรารีหรือแพ็คเกจดังกล่าวเมื่อผ่านบทเรียนต่าง ๆ มันไม่ได้รับการติดตั้งเมื่อฉันติดตั้งเฟรมเวิร์ก Identity นี้ทั้งหมด ... ไม่แน่ใจว่ามันเป็นแค่ฉัน ..

แก้ไข แม้ว่าจะอยู่ในMicrosoft.Owin.Host.SystemWebแอสเซมบลี แต่เป็นวิธีการขยายในSystem.Webเนมสเปซดังนั้นคุณต้องมีการอ้างอิงไปยังอดีตและusingเป็นอันหลัง


6
ขอบคุณสำหรับการหาหนึ่ง: ฉันใช้กวดวิชานี้asp.net/identity/overview/getting-started/ ......และมันเป็นขั้นตอนที่ขาดหายไป
frenchie

23
@tne - ขอบคุณสำหรับความคิดเห็นของคุณ ... แม้ว่าฉันแทบจะ 'วิ่งไปรอบ ๆ อย่างไร้จุดหมาย' - ฉันกำลังติดตามการสอนจากแหล่งข้อมูลที่เชื่อถือได้; จากเว็บไซต์ asp.net ไม่น้อย พวกเขาไม่ได้มีขั้นตอนในการสอนของพวกเขา (นับตั้งแต่มีการเพิ่ม) - เช่นกันความจริงที่ว่าผู้คนกำลังถอนรากถอนโคนทั้งคำตอบนี้และคำถามเดิมก็ไปเพื่อบ่งบอกว่าฉันไม่ใช่คนเดียวที่มีปัญหานี้
Darren Wainwright

5
@ Darren ยุติธรรมพอ (ฉันรู้ฉันอาจจะมีคำพูดที่แตกต่างกัน.)
TNE

3
เพื่อการอ้างอิงเท่านั้น: nuget.org/packages/Microsoft.Owin.Host.SystemWeb/2.1.0
Chris Bohatka

5
ไม่ทราบว่าเป็นจากการอัปเดตข้อมูลอ้างอิงนี้หรือไม่ แต่ฉันต้องเปลี่ยนงานที่มอบหมายเล็กน้อยเป็นvar authenticationManager = HttpContext.Current.GetOwinContext().Authentication;(ปัจจุบันรวมที่ซึ่งมันไม่ได้มีอยู่ในคำถาม)
Ortund

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 () ฉันหมายถึง
Darren Wainwright

2
@Darren - ฉันเล่นกับแม่แบบตัวอย่างเล็กน้อยและอาจมีการชุมนุมที่คุณหายไป ดูเหมือนว่าคุณจะต้องอ้างอิงSystem.Web.Mvcจากโปรเจ็คชั้นเรียนของคุณ เมื่อแสดงความคิดเห็นว่าเป็นสิ่งที่ทำให้HttpContext.GetOwinContext()ไม่เป็นที่รู้จัก (และไม่ใช่การMicrosoft.Owin.Securityชุมนุม)
ทอมมี่

ฉันพยายามทำให้สิ่งนี้ทำงานโดยตรงบนคอนโทรลเลอร์ด้วย - และไม่สามารถหามันได้อีก
Darren Wainwright

19
สิ่งนี้ทำให้ฉันสะดุด มีทรัพย์สินสาธารณะHttpContextในControllerชั้นเรียนดังนั้นถ้าคุณสืบทอดจากที่HttpContext.GetOwinContext()ทำงานได้ตามที่คาดไว้ หากคุณสืบทอดมาApiControllerแม้ว่าจะไม่มีคุณสมบัติดังกล่าว ดังนั้นHttpContextจะอ้างถึงคลาสซึ่งคุณจะต้องใช้Currentเพื่อเข้าถึงอินสแตนซ์ของคลาส ดังนั้นหากคุณคัดลอก / วางรหัสจากคอนโทรลเลอร์ไปยัง ApiController และสงสัยว่าทำไมมันไม่ทำงานนี่คือคำตอบสำหรับคุณ
David Miani

"ปัจจุบัน" เป็น gotcha สำหรับฉัน
คลิกตกลง

24

หลังจากการทดลองและข้อผิดพลาดการเปรียบเทียบการใช้คำสั่งของตัวควบคุมของฉันและตัวควบคุมเทมเพลต Asp.Net

using System.Web;

แก้ไขปัญหาให้ฉัน คุณจะต้องเพิ่ม:

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

เมื่อต้องการใช้วิธี GetUserManager

Microsoft ไม่สามารถหาวิธีแก้ไขปัญหานี้โดยอัตโนมัติด้วยการคลิกขวาและแก้ไขเช่นเดียวกับการใช้คำสั่งอื่น ๆ


1
สิ่งนี้ใช้ได้สำหรับฉันเช่นกัน ฉันมีไลบรารี Identity อยู่แล้ว แต่ดูเหมือนว่าต้องมี System.Web
SouthShoreAK

1
เห็นได้ชัดว่าสิ่งนี้เคลื่อนไหวไปมามากมายทั้งในชุดประกอบและในเนมสเปซ ทำให้มันเจ็บปวดจริง ๆ กับมันเป็นวิธีส่วนขยาย ฉันได้อัปเดตห้องสมุดทั้งหมดของฉันแล้วและคำตอบนี้แสดงถึงที่ ๆ มันอยู่ในปัจจุบัน
แชนนอน

อ่าคุณตกนรกในรูปแบบใหม่
JustJohn

1
ใช่เศร้าวิธีการขยายไม่สามารถแก้ไขได้โดยอัตโนมัติ
Ronen Festinger

22

ในกรณีของฉันเพิ่มMicrosoft.AspNet.WebApi.Owinการอ้างอิงผ่านทาง nuget ได้หลอกลวง


ใช่มันทำให้ฉันเป็นเวอร์ชั่นล่าสุดในปัจจุบัน วิธีการขยายอยู่ในแพ็คเกจนี้ซึ่งก็คือAssemby System.Web.Http.OwinและภายในNamespace System.Net.Http
oatsoda

16

Microsoft.AspNet.Identity.Owinให้แน่ใจว่าคุณติดตั้งแพคเกจ nuget จากนั้นเพิ่มSystem.Net.Httpเนมสเปซ


ฉันมีอันนั้นด้วย ปรากฎว่ามีห้องสมุดอื่นที่ไม่ได้ติดตั้งเมื่อมีการติดตั้งข้อมูลประจำตัว
Darren Wainwright

@Darren กรุณาเพิ่มชื่อแพ็คเกจ ขอบคุณ
ดาวเสาร์เทคโนโลยี

6
@ SaturnTechnologies สำหรับฉันแพคเกจอื่น ๆ คือ Microsoft.Owin.Host.SystemWeb และเนมสเปซ System.Web
WiSeeker

1
ฉันสอง WiSeeker สำหรับฉันมันไม่ได้ช่วยอะไร ข้อเสนอแนะของคาร์เรนในการติดตั้งMicrosoft.Owin.Host.SystemWebนั้นทำได้ยาก
Max Barraclough


10

สำหรับ Devs รับข้อผิดพลาดนี้ในโครงการ Web API -

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;
    }
  }

ฉันกำลังใช้เนมสเปซในไฟล์รหัสที่ใช้ 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

เพื่อรับ UserManager ใน API

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

โดยที่ AppUserManager เป็นคลาสที่สืบทอดจาก UserManager


4

ฉันมีแพ็คเกจและการใช้งานที่ถูกต้อง แต่ต้องสร้างก่อนจึงจะสามารถGetOwinContext()ทำงานได้


คุณแก้ไขงานสร้างของคุณอย่างไรเพื่อให้ทำงานได้เป็นครั้งแรก
Nordes

@Nordes บางครั้ง VS ล้มเหลวในการสร้างในพื้นหลัง (เช่น: มันบอกคุณว่ามีข้อผิดพลาดในการรวบรวม) แต่การทริกเกอร์การสร้างจริง นั่นเป็นสิ่งที่เควินกำลังประสบอยู่
ไม่ฝักใฝ่ฝ่ายใด

0

เพียงติดตั้งแพคเกจนี้และรหัสของคุณจะทำงาน: => Install-Package Microsoft.Owin.Host.SystemWeb -Version 2.1.0

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.