0

爲了安全起見,我不希望只有任何人能夠在我的網站上註冊,但我無法阻止用戶註冊,同時在網站上有一個註冊頁面,所以我添加了一個「授權」標誌給ApplicationUser型號:如何使用ASP.NET身份將用戶引入數據庫?

public class ApplicationUser : IdentityUser 
{ 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
    public bool Authorized { get; set; } 
} 

的想法是,如果一個用戶,無論是登錄還是不行,沒有這個屬性設置爲true值,則用戶將無法訪問受保護的內容。以前授權的用戶將不得不授權新用戶。

這帶來了如何獲得第一個用戶授權的問題,所以我想我會讓用戶進入我的遷移。見下:

namespace Ortund.Migrations 
{ 
    internal sealed class Configuration : 
     DbMigrationsConfiguration<Ortund.Models.ApplicationDbContext> 
    { 
     protected override void Seed(Ortund.Models.ApplicationDbContext context) 
     { 
      context.Users.AddOrUpdate(
       u => u.Id, 
       new Models.ApplicationUser { EmailAddress = "[email protected]", Authorized = true, EmailConfirmed = true } 
      ); 
     } 
    } 
} 

顯然我錯過了一些關鍵字段在這裏密碼散列一個,這就是我有麻煩。

我不知道UserManager如何散列密碼,所以我似乎無法複製該過程,因爲函數不是異步任務。

以供參考,在這裏是在的AccountController註冊方法:

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

的CreateAsync功能指定將被散列明文密碼字符串。試圖在上面的Seed方法中複製此內容,我只能訪問ApplicationUserManager.Create(Microsoft.AspNet.Identity.Owin.IdentityFactorOptions<ApplicationUserManager> options, Microsoft.Owin.IOwinContext context),據我所知,這不符合我的要求。

如何在我的播種數據中創建完整的ApplicationUser?

+0

它是一個很長的時間,因爲香港專業教育學院做到了這一點,但敢肯定,你應該重寫種子法上的DbContext而不是遷移。 – Derek

+1

「授權」角色可以達到同樣的目的,但適合現有的安全模型(這意味着您不必跳過限制來限制對操作的訪問)。 Re:你現在的問題,讓框架爲你處理帳戶設置。 – Basic

回答

4

您可以調用UserManager.Create方法並將其傳遞給用戶名和純文本密碼。這將哈希密碼爲你獲取到數據庫

事情是這樣的:

var userStore = new UserStore<ApplicationUser>(context); 
var userManager = new UserManager<ApplicationUser>(userStore); 
var user = new ApplicationUser { UserName = "username"}; 
userManager.Create(user, "password"); 
+0

...然後設置'授權'標誌。 – Basic

+0

我還遠遠沒有能夠調試這個,因爲我還有很多工作要做,但是沒有設計時間錯誤,所以我在這個答案上給了你一個讚賞 – Ortund

相關問題