Nhận dạng ASP.NET - HttpContext không có phương thức mở rộng cho GetOwinContext


384

Tôi đã tải xuống và chạy thành công mẫu ASP.NET Identity từ đây: https://github.com/rustd/AspnetIdentitySample

Bây giờ tôi đang ở giữa triển khai khung nhận dạng ASP.NET trong dự án của mình và gặp phải một vấn đề, điều đó khiến tôi phát điên cả ngày ...

GetOwinContext() không tồn tại như một phương thức mở rộng trên của tôi HttpContext

Tôi đang thực hiện khung nhận dạng trong thư viện lớp. Tôi đã cài đặt tất cả (phiên bản tiền phát hành) mới nhất của khung Nhận dạng và mọi thứ - ngoài điều này - đang hoạt động tốt.

Tôi đã thử thực hiện cùng mã với cùng một lệnh trong bộ điều khiển của mình và tìm thấy cùng một vấn đề.

Tôi rõ ràng đang thiếu một tài liệu tham khảo ở đâu đó, mặc dù tôi không biết gì ..! ..

Khối mã đang giết chết tôi là:

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

Tôi đã thêm các tham chiếu đến sau - đã thử cả hai trong thư viện lớp của tôi và cũng trực tiếp trên bộ điều khiển, không ai trong số chúng làm việc cho tôi ...

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

... đây là đẩy tôi lên tường .... có ý kiến ​​gì không?

CẬP NHẬT

Tôi đã kiểm tra các phiên bản của Danh tính & SỞ HỮU trong mẫu và tôi đã đảm bảo rằng tôi có các phiên bản tương tự trong giải pháp của mình.

Hơn nữa, nếu tôi tìm kiếm trình duyệt đối tượng trên mẫu để GetOwinContexttôi có thể tìm thấy phương thức, tuy nhiên khi tôi tìm kiếm nó trong giải pháp của mình thì không thể tìm thấy ... Tôi phải có một số thư viện đã lỗi thời, nhưng tôi có thể ' tìm thấy nó

Câu trả lời:


713

ARGH!

Tôi tìm thấy nó ... Tôi không có một gói phụ, được gọi làMicrosoft.Owin.Host.SystemWeb

Khi tôi tìm kiếm và cài đặt nó, nó hoạt động.

Bây giờ - tôi không chắc chắn nếu tôi bỏ lỡ tất cả mọi thứ, mặc dù không tìm thấy tài liệu tham khảo đến thư viện hoặc gói như vậy khi đi qua các hướng dẫn khác nhau. Nó cũng không được cài đặt khi tôi cài đặt tất cả khung Nhận dạng này ... Không chắc đó có phải là tôi không ..

EDIT Mặc dù trong phần Microsoft.Owin.Host.SystemWeblắp ráp, nó là một phương thức mở rộng trong System.Webkhông gian tên, vì vậy bạn cần phải có tham chiếu đến cái trước và là usingcái sau.


6
Cám ơn tìm thấy một ra: Tôi đang sử dụng hướng dẫn này asp.net/identity/overview/getting-started/... và đó là một bước mất tích
Frenchie

23
@tne - cảm ơn bạn đã nhận xét của bạn ... mặc dù tôi hầu như không "chạy xung quanh một cách vô mục đích" - tôi đã làm theo hướng dẫn từ một tài nguyên đáng tin cậy; từ trang asp.net không hơn không kém. Họ không có bước đó trong hướng dẫn của họ (kể từ khi được thêm vào) - ngoài ra, thực tế mọi người đang ủng hộ cả câu trả lời này và Q ban đầu cũng chỉ ra rằng tôi không phải là người duy nhất gặp vấn đề này.
Darren Wainwright

5
@Darren, đủ công bằng. (Tôi nhận ra rằng tôi có thể đã nói từ đó khác đi.)
tne


5
Không biết có phải từ việc cập nhật tài liệu tham khảo này không, nhưng tôi đã phải thay đổi bài tập của mình một chút thành var authenticationManager = HttpContext.Current.GetOwinContext().Authentication;(Hiện tại bao gồm cả nơi nó không có trong câu hỏi).
Ortund

177

Tôi tin rằng bạn cần tham chiếu hiện tại HttpContextnếu bạn ở ngoài bộ điều khiển. Các bộ điều khiển MVC có một tham chiếu cơ bản đến bối cảnh hiện tại. Tuy nhiên, bên ngoài đó, bạn phải tuyên bố rõ ràng bạn muốn hiện tạiHttpContext

return HttpContext.Current.GetOwinContext().Authentication;

Đối với nó không hiển thị, một mẫu dự án MVC 5 mới sử dụng mã bạn hiển thị ở trên ( IAuthenticationManager)) có các câu lệnh sau sử dụng ở đầu bộ điều khiển tài khoản:

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;

Nhận xét từng cái, nó GetOwinContext()thực sự là một phần của hội đồng System.Web.Mvc.


Đã thử nó và không thể tìm thấy nó. - ý tôi là GetOwinContext ().
Darren Wainwright

2
@Darren - Tôi đã chơi với mẫu mẫu một chút và có thể có lắp ráp bạn đang thiếu. Có vẻ như bạn sẽ cần tham khảo System.Web.Mvctừ dự án lớp học của bạn. Khi được bình luận, đó là những gì đã HttpContext.GetOwinContext()trở nên không xác định (và không phải là Microsoft.Owin.Securityhội đồng)
Tommy

Tôi cũng đã cố gắng để điều này hoạt động trực tiếp trên bộ điều khiển - và một lần nữa không thể tìm thấy nó.
Darren Wainwright

19
Điều này làm tôi vấp ngã. Có một tài sản công cộng HttpContexttrên Controllerlớp, vì vậy nếu bạn thừa kế từ đó, HttpContext.GetOwinContext()hoạt động như mong đợi. Nếu bạn thừa kế từ ApiControllermặc dù, không có tài sản đó. Do đó, HttpContextsẽ tham chiếu đến lớp, sẽ yêu cầu bạn sử dụng Currentđể truy cập một thể hiện của lớp. Vì vậy, nếu bạn sao chép / dán mã từ Bộ điều khiển vào ApiContoder và tự hỏi tại sao nó không hoạt động, đây là câu trả lời cho bạn.
David Miani

"Hiện tại" là gotcha cho tôi
Nhấp vào Ok

24

Sau khi dùng thử và lỗi so sánh các câu lệnh sử dụng bộ điều khiển của tôi và bộ điều khiển Mẫu Asp.Net

using System.Web;

Giải quyết vấn đề cho tôi. Bạn cũng sẽ cần phải thêm:

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

Để sử dụng phương thức GetUserManager.

Microsoft không thể tìm cách giải quyết vấn đề này một cách tự động bằng nhấp chuột phải và giải quyết như các câu lệnh bị thiếu khác bằng cách sử dụng?


1
Cái này cũng có tác dụng với tôi. Tôi đã có các thư viện Nhận dạng, nhưng dường như cần System.Web.
SouthShoreAK

1
Điều này rõ ràng đã được di chuyển xung quanh rất nhiều, cả trong các hội đồng và trong không gian tên. Làm cho nó thực sự đau đớn với nó là một phương pháp mở rộng. Tôi đã cập nhật tất cả các thư viện của mình và câu trả lời này phản ánh vị trí hiện tại của nó.
shannon

ah, bạn sẽ là địa ngục trong một hình dạng mới
JustJohn

1
Có, đáng buồn thay, các phương pháp mở rộng không thể được giải quyết tự động.
Ronen Festinger

22

Trong trường hợp của tôi, việc thêm tham chiếu Microsoft.AspNet.WebApi.Owin qua nuget đã thực hiện thủ thuật này.


Vâng, điều này đã làm điều đó cho tôi trên phiên bản mới nhất hiện tại. Phương thức mở rộng nằm trong Gói này, đó là Assemby System.Web.Http.Owin và trong Namespace System.Net.Http
oatsoda

16

Hãy chắc chắn rằng bạn đã cài đặt gói nuget Microsoft.AspNet.Identity.Owin. Sau đó thêm System.Net.Httpkhông gian tên.


Tôi cũng có cái đó Hóa ra có một thư viện khác KHÔNG được cài đặt khi công cụ Nhận dạng được cài đặt.
Darren Wainwright

@Darren Vui lòng thêm tên gói. Cảm ơn bạn
Saturn Technologies

6
@SaturnTechnology Đối với tôi, gói khác là Microsoft.Owin.Host.SystemWeb và không gian tên System.Web
WiSeeker

1
Tôi thứ hai WiSeeker. Đối với tôi, điều này đã không giúp đỡ. Microsoft.Owin.Host.SystemWebMặc dù đề nghị của Darren để cài đặt đã lừa.
Max Barraclough

13

Chỉ cần sử dụng

HttpContext.Cản.GetOwinContext ()

đã lừa trong trường hợp của tôi.


10

Đối với các Dev nhận được lỗi này trong Dự án API Web -

Phương thức mở rộng GetOwinContext được xác định trong System.Web.Http.Owindll và sẽ cần thêm một gói nữa Microsoft.Owin.Host.SystemWeb. Gói này cần được cài đặt trong dự án của bạn từ nuget.

Liên kết đến gói : Lệnh cài đặt gói OWIN -

Install-Package Microsoft.AspNet.WebApi.Owin    

Liên kết đến Gói System.web : Lệnh Cài đặt Gói -

Install-Package Microsoft.Owin.Host.SystemWeb

Để giải quyết lỗi này, bạn cần tìm lý do tại sao nó xảy ra trong trường hợp của bạn. Vui lòng kiểm tra chéo các điểm dưới đây trong mã của bạn -

  1. Bạn phải tham khảo Microsoft.AspNet.Identity.Owin;

    sử dụng Microsoft.AspNet.Identity.Owin;

  2. Xác định GetOwinContext()dưới HttpContext.Currentnhư dưới đây -

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

    HOẶC LÀ

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

Mã hoàn chỉnh nơi GetOwinContext () được sử dụng -

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

Namespace đang sử dụng trong tệp mã nơi GetOwinContext () được sử dụng

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;

Tôi đã gặp lỗi này trong khi di chuyển mã từ dự án này sang dự án khác.


4

Để có được Trình quản lý người dùng trong API

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

trong đó AppUserManager là lớp kế thừa từ UserManager.


4

Tôi đã có tất cả các gói và cách sử dụng chính xác, nhưng phải xây dựng trước khi tôi có thể đi GetOwinContext()làm.


Làm thế nào bạn sửa bản dựng của bạn để làm cho nó hoạt động lần đầu tiên?
Nordes

@Nordes Đôi khi VS không xây dựng trong nền (nghĩa là: nó cho bạn biết có lỗi biên dịch), nhưng kích hoạt một bản dựng thực sự (hoặc thường xuyên dọn dẹp hơn và sau đó xây dựng) sẽ khắc phục được. Đó có thể là những gì Kevin đã trải qua.
Maverick

0

Chỉ cần cài đặt gói này và mã của bạn sẽ hoạt động: => Cài đặt-Gói Microsoft.Owin.Host.SystemWeb -Version 2.1.0

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.