2016-04-23 191 views
6

坦率地講,我對ASP.NET MVC來說是個很新的東西,因此我請你在解釋我的問題時與我一起裸露。 我需要什麼? 我有一個ASP.NET身份系統設置和運行與外部登錄。無論出於何種原因,我需要在ASP.NET身份驗證之後設置自定義身份驗證。讓我解釋一下如何?假設我有三個頁面供用戶在我的應用程序頁面A,B,C上查看。 誰可以瀏覽頁面? 任何匿名用戶都可以查看頁面A. 誰可以瀏覽頁面A & B? 任何用戶通過他/她的電子郵件&密碼或外部登錄名創建了一個帳戶。 誰可以瀏覽頁面A,B & C?如何設置asp.net mvc身份的自定義身份驗證?

這裏是我想要設置自定義驗證的地方。 任何使用他/她的電子郵件帳戶或外部登錄名創建帳戶的用戶,並具有有效的序列號。 串口密鑰? 我設置ASP.NET身份類,如下:

public class UserDetails : IdentityUser 
    { 
     public virtual MembershipSerial MembershipSerial { get; set; } 
    } 

    public class MembershipSerial 
    { 
     [HiddenInput(DisplayValue=false)] 
     public int Id { get; set; } 
     [HiddenInput(DisplayValue=false)] 
     public string Serial { get; set; } 
     [Required] 
     [Display(Name="Membership Serial")] 
     public string SerialConfirmed { get; set; } 
    } 

    public class MyDbContext : IdentityDbContext<UserDetails> 
    { 
     public MyDbContext() 
      : base ("EFDbContext") 
     { 
     } 
     public System.Data.Entity.DbSet<MembershipSerial> MembershipSerial { get; set; } 
    } 

正如你看到的上面的類我在班上設立了三個屬性。字段ID是針對連續出版物的ID,串行是由管理員輸入的14個字母數字字母,因爲您可以看到它是一個不允許爲空的隱藏字段。 SerialConfirmed字段也是14個字母數字字母,將由用戶輸入以進行認證,以便在應用程序中執行某些特定任務。 整個概念是,登錄用戶應該被推送進行第二種類型的身份驗證,即身份驗證和序列號。

我非常需要幫助和在線搜索沒有太多幫助。如果你需要更多的信息或尚不清楚,請不要猶豫,問我。 Regards 編輯:我首先使用EF代碼。 Dostdar

+0

因此,這種情況是,用戶登錄,嘗試訪問某種頁面(或執行一些操作),然後呈現某種類型的挑戰UI?如果他們輸入有效的代碼,他們被允許訪問該頁面,並且只有該頁面(或操作)? –

+0

@TiesonT。這正是我想要的 –

+1

在某些情況下,允許使用連續字符串進行身份驗證的操作可以執行多個操作 –

回答

0

看起來像一個自定義的授權屬性會起作用。下面是一個示例實現:

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = false)] 
public class RequiresSerialValidationAttribute : AuthorizeAttribute 
{ 
    public override void OnAuthorization(AuthorizationContext filterContext) 
    { 
     bool hasValidSerial = false; 
     if (filterContext.HttpContext.Request.IsAuthenticated) 
     { 
      string userName = filterContext.HttpContext.User.Identity.Name; 

      if (!string.IsNullOrWhiteSpace(userName)) 
      {  
       string serial = string.Empty;// TODO: Retrieve user's previously authenticated serial, perhaps from Session or a cookie? 

       if(!string.IsNullOrWhiteSpace(serial)) 
       { 
        var service = DependencyResolver.Current.GetService<IYourAuthService>(); 
        hasValidSerial = service.IsSerialValidForUser(userName, serial); 
       } 
      } 
     } 

     if (!hasValidSerial) 
     { 
      filterContext.Result = new RedirectToRouteResult(new RouteValueDictionary(new { controller = "yourserialauthcontroller", action = "yourauthaction", area = string.Empty })); 
     } 
     else 
     { 
      base.OnAuthorization(filterContext); 
     } 
    } 
} 

你會裝飾作用的方法與此屬性:

[RequireSerialValidation] 
public ActionResult SomeAction() 
{ 
} 

屬性會觸發一個重定向到你的挑戰行動,在那裏你提示用戶對它們的序列。假設一切順利,你將它們的序列存儲在某個地方(Session可以在這裏工作,或者創建一個加密的cookie),然後重定向回原始動作。在第二次嘗試中,您已經驗證該操作是允許的,因此不會發生重定向。

您的驗證服務可以是任何你想要的。在這個例子中,我假設你正在使用依賴注入,並且你已經配置了全局依賴解析器。鑑於此,您IYourAuthService看起來是這樣的(忽略其他方法):

public IYourAuthService 
{ 
    bool IsSerialValidForUser(string userName, string serial); 
} 

與實現,像這樣:

public YourAuthService : IYourAuthService 
{ 
    public bool IsSerialValidForUser(string userName, string serial) 
    { 
     using(var context = new YourEntityFrameworkDbContext()) 
     { 
      return context.Users.Any(u => u.UserName.Equals(userName, StringComparison.OrdinalIgnoreCase) && u.Serial.Equals(serial, StringComparison.OrdinalIgnoreCase)); 
     } 
    } 
} 

這裏假設你有一個表,你的數據庫稱爲User(或Users) ,並且UserNameSerial是該表上的字段。 StringComparison.OrdinalIgnoreCase可讓您對要比較的字符串進行不區分大小寫,文化不敏感的匹配。

+0

如何比較用戶輸入的序列號與我的sql表中已有的序列號? –

+0

這會發生在我提到的以「var service = ...」開頭的行中的服務類版本中。 –

+0

Tieson我真的很抱歉問你這個,因爲你知道我真的是初學者,請你更新你的問題,從數據庫中提取數據並比較兩者?儘管在專家級別上,我仍努力嘗試,但無法從上面的代碼中找到任何東西。非常感謝您的努力。我真的需要你的幫助 –