2014-04-14 11 views
7

Dự án Asp.Net MVC 5 hiện tại của tôi ủy quyền Địa chỉ email cho Tên người dùng. Bây giờ tôi muốn nâng cấp ASPNet Identity v1.0 đến v2.0 để tận dụng tất cả các tính năng mới của nó (see here).Bản sao AspNet 2.0 Email và tên người dùng trùng lặp

Tuy nhiên, ASPNET nhận dạng v2.0 thêm Email như một cột riêng đến Người dùng bảng và cho biết thêm một tài sản tương ứng với lớp IdentityUser.

Tôi không muốn sao chép Tên người dùng vào cột mới Email này. Làm thế nào tôi có thể bản đồ Thuộc tính Email này của IdentityUser để sử dụng cột UserName hiện tại & tài sản? Có thể bỏ qua thuộc tính Email này và bỏ qua thêm cột trong bảng Người dùng không? Có ai đã thử điều này?

Vui lòng chia sẻ.

Cập nhật

Đây là hạn chế tính 2.0. Chúng tôi không thể bỏ qua thuộc tính Email hoặc để nó Null. Một số chức năng Identity sẽ không hoạt động. :(

+0

tôi có thể làm cho công việc này bằng cách triển khai lớp người dùng của riêng tôi mà chỉ kế thừa từ IUser và triển khai UserManger, UserStore. – user210757

+0

@santhosh bạn có thể vui lòng xem câu hỏi này và gửi cho tôi đề xuất không? – SivaRajini

+0

http://stackoverflow.com/questions/36929767/asp-net-identity-entity-framework-database-first-approach-with-own-table-definti – SivaRajini

Trả lời

3

Bạn có thể thử một trong những:

  1. Cố gắng lờ nó đi bởi một trong hai trọng Email tài sản trong lớp User của bạn và unmapping nó hoặc sử dụng API thạo

    public class ApplicationUser : IdentityUser 
    { 
        // .... 
    
        [NotMapped] 
        public override string Email { get; set; } 
    } 
    

    hoặc

    .
    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
        modelBuilder.Entity<ApplicationUser>().Ignore(u => u.Email); 
    } 
    
  2. Khi bạn đăng ký sử dụng r chỉ cần đảm bảo rằng bạn cư Email với bạn UserName

    public async Task<ActionResult> Register(RegisterViewModel model) 
    { 
        if (ModelState.IsValid) 
        { 
         var user = new ApplicationUser { UserName = model.Email, Email = model.Email }; 
         // ... 
        } 
    } 
    

Tất nhiên, bạn luôn có thể bỏ qua Email cột nếu bạn sẽ không sử dụng nó, vì nó cho phép null, nó sẽ chỉ được ngồi trong bảng AspNetUsers với bó NULL, không phải là cách tiếp cận tốt nhất nhưng hãy nhớ rằng bằng cách bỏ qua nó, bạn có thể mất các tính năng mới mà ASP.NET Identity 2 có thể cung cấp mà bạn có thể muốn sử dụng.

LƯU Ý Tuy nhiên, tôi không chắc liệu tùy chọn số 1 có hoạt động trên Email vì nó có thể được sử dụng khắp nơi trong mã Nhận dạng mới. Đáng thử mặc dù. Tôi biết đó là cách bạn có thể loại bỏ các cột khác nếu bạn không cần chúng. Cá nhân tôi tình cờ sử dụng thuộc tính/cột Email mới vì vậy tôi chưa thử nó.

Không chắc chắn nếu nó giúp bạn, nhưng nghĩ rằng tôi muốn chia sẻ nó chỉ trong trường hợp.

+2

Tôi đã thử tùy chọn 1 của bạn không hoạt động. (InvalidOperationException: Thuộc tính 'Email' không phải là thuộc tính được khai báo trên loại 'ApplicationUser' .Xác minh rằng thuộc tính chưa được loại trừ một cách rõ ràng khỏi mô hình bằng cách sử dụng phương thức Bỏ qua hoặc chú thích dữ liệu NotMappedAttribute Đảm bảo rằng nó là một thuộc tính nguyên thủy hợp lệ. .) Tùy chọn 2 của bạn đã được hiển thị trong các mẫu (kiểm tra nuget.org/packages/Microsoft.AspNet.Identity.Samples). Tôi không muốn có cột Email trong bảng Người dùng và do đó, câu hỏi! – Santosh

+0

@ Santosh Point là rất nhiều mã Identity được kết hợp chặt chẽ với cột 'email', do đó việc xóa nó có thể phá vỡ nhiều hơn bạn nhận ra - chắc chắn đó không phải là điều bạn muốn kể từ khi chúng tôi nói về bảo mật. Và chúng ta hãy trung thực, một cột NULL không sử dụng sẽ không bao giờ là nút cổ chai trong hiệu suất ứng dụng của bạn ;-) –

1

Tôi có cùng một vấn đề, và cách mà tôi giải quyết nó là địa chỉ email là giống như tên người dùng khi tạo user:

var newUser = new ApplicationUser() 
{ 
    UserName = email, 
    Email = email, 
}; 

Tuy nhiên, nếu bạn cố gắng để tạo ra một tài khoản với một tên người dùng trùng lặp, bạn sẽ nhận được 2 lỗi xác thực, một cho trường tên người dùng và một cho địa chỉ email.

Để khắc phục điều đó, cho phép các địa chỉ email không phải là duy nhất (họ vẫn sẽ là duy nhất mặc dù như tên người dùng của bạn là duy nhất) bằng cách chỉnh sửa identityconfig.cs file:

manager.UserValidator = new UserValidator<ApplicationUser>(manager) 
      { 
       AllowOnlyAlphanumericUserNames = false, 
       RequireUniqueEmail = false 
      }; 
Các vấn đề liên quan