6

Tôi đang cố gắng điều hướng lỗ đen đó là triển khai tùy chỉnh Thành viên danh tính. Mục tiêu của tôi ngay bây giờ chỉ đơn giản là để có được dòng này từ ApiController của tôi để lấy một cách chính xác UserManager tôi:Triển khai thành công UserManager tùy chỉnh <IUser> trong Identity 2.0

public IHttpActionResult Index() 
{ 
    var manager = HttpContext.Current.GetOwinContext().GetUserManager<UserManager<MyUser,int>>(); 
    //manager is null 
} 

Dưới đây là thiết lập của tôi. Trong Cấu hình Startup 's của tôi, tôi lập WebAPI và thêm OwinContext tôi:

app.CreatePerOwinContext<UserManager<MyUser,int>>(Create); 

My Tạo phương pháp:

public static UserManager<User,int> Create(IdentityFactoryOptions<UserManager<MyUser,int>> options, IOwinContext context) 
{ 
    return new UserManager<MyUser,int>(new UserStore(new DbContext())); 
} 

phần còn lại là việc thực hiện cơ bản nhất mà tôi có thể làm.

myuser:

public class MyUser : IUser<int> 
{ 
    public int Id { get; set; } 
    public string UserName { get; set; } 
} 

MyUserStore:

public class MyUserStore : IUserStore<MyUser,int> 
{ 
    private IdentityDbContext context; 
    public MyUserStore(IdentityDbContext c) 
    { 
     context = c; 
    } 

    //Create,Delete, etc implementations 
} 

MyDbContext:

public class MyDbContext : IdentityDbContext 
{ 
    public MyDbContext() : base("Conn") 
    { 

    } 
} 

Đây là tất cả vì lợi ích của việc học cách nhận dạng hoạt động, mà tôi khá thuyết phục không người ta thực sự biết. Tôi muốn có thể tùy chỉnh đầy đủ người dùng và vai trò của mình sau cùng, tránh IdentityUser của Microsoft.

Một lần nữa, vấn đề của tôi ngay bây giờ là trong bộ điều khiển của tôi, tôi nhận được null khi cố gắng truy xuất UserManager của mình.

Bất kỳ và tất cả trợ giúp đều được đánh giá cao.

+0

Tuyên bố khá lớn về "tìm hiểu cách thức hoạt động của Danh tính, điều mà tôi khá thuyết phục không ai thực sự biết". Mã nguồn biết. Mã nguồn có sẵn thông qua trình biên dịch ngược. – trailmax

+1

Đó là một biểu hiện của sự thất vọng của tôi khi tôi không thể tìm thấy rất nhiều ví dụ – Jonesopolis

Trả lời

3

Tôi có một số lỗi, nhưng một trong những chính được rằng lớp Startup của tôi trông giống như:

public class Startup 
{ 
    public void Configuration(IAppBuilder app) 
    { 
     app.UseWebApi(new WebApiConfig()); 

     app.CreatePerOwinContext(MyDbContext.Create); 
     app.CreatePerOwinContext<MyUserManager>(MyUserManager.Create); 
    } 
} 

Tất nhiên, các đường ống dẫn OWIN sẽ cắm phụ thuộc của tôi sau bắn ra các cuộc gọi WebAPI. Chuyển những người xung quanh là vấn đề chính của tôi.

Ngoài ra, cuối cùng tôi đã tìm thấy cách this great guide trong tìm kiếm của Google của mình. Nó trả lời khá nhiều mọi thứ tôi đã nhận được. Tôi cần triển khai một lớp cụ thể là UserManager<MyUser,int>

Tôi hy vọng điều này có thể giúp ai đó sau này.

1

Bạn đang sử dụng MyIdentity.User hoặc MyIdentity.MyUser? Bạn có hai đối tượng khác nhau được chuyển vào tham số TUser trong ví dụ của bạn.

Tôi đã thử nghiệm triển khai của bạn và không gặp sự cố khi truy xuất phiên bản UserManager đã đăng ký.

Để tùy chỉnh hoàn toàn người dùng và vai trò của bạn, bạn sẽ cần phải thực hiện việc triển khai UserManager mới để có được xác thực, xác nhận quyền sở hữu, cuộc gọi phương thức, v.v.

Nếu bạn đang cố gắng tìm hiểu cách Identity hoạt động, tôi khuyên bạn nên làm việc với việc triển khai mặc định UserManager và IdentityUser. Làm điều đó để làm việc trước.

Here is a good tutorial

Cuối cùng, tạo người dùng của riêng bạn thực hiện IdentityUser. Tất cả các chức năng UserManager sẽ hoạt động và bạn sẽ có quyền truy cập vào các thuộc tính mới của mình. Các thuộc tính bổ sung sẽ tự động được xây dựng vào bảng AspnetUser được tạo bởi IdentityDbContext.

public MyIdentityUser : IdentityUser 
{ 
    public int Id {get; set;} 
    public string CustomUserId {get; set;} 
    public string UserId { get; set; } 
} 

Hoặc bạn có thể bắt đầu xây dựng MyIdentityUser tùy chỉnh của bạn với tham chiếu khóa ngoài cho các đối tượng khác.

public MyIdentityUser : IdentityUser 
{ 
    public virtual UserProperties Properties { get; set; } 
} 

Điều này có giúp ích gì không?

+0

Cảm ơn Scott. Tôi đã thay đổi các lớp học của mình và khi tôi chỉnh sửa câu hỏi, tôi đã làm một công việc kém để duy trì sự nhất quán đó. Vấn đề chính của tôi tôi được đăng trong một câu trả lời bản thân mình, nhưng của bạn là rất hữu ích là tốt. Bạn có biết lợi ích của việc sử dụng IdentityUser vs. IUser không? – Jonesopolis

+0

IUser được thực hiện bởi IdentityUser, một hợp đồng cho thuộc tính Id và UserName. – Scott

+0

(tiếp theo) Đối tượng chung của TUser mà UserManager chấp nhận là bắt buộc để triển khai IUser. Vì vậy đối tượng MyUser của bạn được chấp nhận làm kiểu đối tượng chung, nhưng UserManager có nhiều phương thức hơn như "ChangePasswordAsync (người dùng TUser, mật khẩu chuỗi)" phụ thuộc vào các thuộc tính đó là một phần của đối tượng chung. IdentityUser chứa các thuộc tính đó. Sử dụng IdentityUser làm lớp cơ sở cho đối tượng MyUser của bạn giúp bạn tiết kiệm thời gian từ việc tự mình khai báo hoặc ghi đè các phương thức UserManager để làm cho chúng hoạt động với các thuộc tính được định nghĩa tùy chỉnh của bạn. – Scott

Các vấn đề liên quan