2016-04-23 42 views
6

Açıkçası, ASP.NET MVC'ye oldukça yeni geldim, bu yüzden sorumu açıklarken yanımda olmanızı istiyorum. Neye İhtiyacım Var ?! Bir ASP.NET kimlik sistemi kurulumum var ve harici girişler ile çalışıyor. Hangi nedenle olursa olsun, ASP.NET kimlik doğrulamasından sonra özel bir kimlik doğrulaması ayarlamanız gerekir. Nasıl açıklayayım? Kullanıcıların benim uygulamamda görüntüleyebilmeleri için üç sayfam var, A, B, C. Page A'yı kimler görüntüleyebilir? herhangi bir anonim kullanıcı Sayfa A & B görüntüleyebilir sayfa A. görebilir? onun/onu eposta & şifre ile veya harici giriş bilgileri olan ya bir hesap oluşturduk herhangi bir kullanıcı. Sayfa A'yı B & C görüntüleyebilirsiniz ?Asp.net mvc kimliğinde özel kimlik doğrulama nasıl kurulur?

Özel kimlik doğrulaması ayarlamak istediğiniz yer İşte. E-posta hesabıyla veya harici girişleri ile bir hesap oluşturmuş olan VE geçerli bir seri anahtarı olan herhangi bir kullanıcı. Seri Anahtar? Ben aşağıda ASP.NET kimliğindeki bir sınıf ayarlayın: Sınıfın yukarıya bakın gibi

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; } 
    } 

i sınıfta üç özelliği kurdu. Alan Kimliği, dizilerin Ids için, Seri, yönetici tarafından girilen ve null izin vermeyen bir gizli alan olduğunu görebilirsiniz olarak 14 Alfa sayısal harfler. SerialConfirmed alanı ayrıca, uygulamada belirli görevleri yapmak için kullanıcıların kimlik doğrulaması yapmaları için girilecek 14 adet Alfa Sayısal harftir. Tüm konsept, oturum açmış bir kullanıcının, seri numaralarına göre kimlik doğrulaması olan ikinci bir tip kimlik doğrulaması için itilmesi gerektiğidir.

Ben yardıma muhtaç ciddi duyuyorum ve arama çevrimiçi çok fazla yardımcı olmadı. Daha fazla bilgiye ihtiyacınız varsa veya henüz kesin değilse, bana sormaya çekinmeyin. Saygılar Düzenleme: Önce EF kodunu kullanıyorum. Dostdar

+0

Bu nedenle, bir kullanıcı oturum açar, bir tür sayfaya erişmeyi dener (veya bir eylemi yürütür) ve daha sonra bir çeşit kullanıcı arayüzü ile sunulur. Geçerli bir kod girerlerse, o sayfaya ve yalnızca bu sayfaya (veya eyleme) erişmelerine izin verilir? –

+0

@TiesonT. Tam olarak ne istediğim budur –

+1

Bazı durumlarda, dizilerle kimlik doğrulamanın birden çok eylem yapmasına izin verilir –

cevap

0

O çalışacak özel bir yetkilendirme öznitelik gibi görünüyor. İşte bir örnek uygulama:

[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); 
     } 
    } 
} 

Bu özniteliği ile eylem yöntemleri süslemek istiyorum:

[RequireSerialValidation] 
public ActionResult SomeAction() 
{ 
} 

nitelik onların seri için kullanıcı istemi senin meydan eylemi, bir yönlendirme tetikleyecektir. Her şeyin iyi gittiğini varsayarak, dizilerini bir yerde saklarsınız (Oturum burada çalışabilir veya şifrelenmiş bir çerez oluşturabilir) ve ardından orijinal eyleme geri yönlendirilir. Bu ikinci denemede, eylemin izin verildiğini doğrulamışsınızdır, dolayısıyla yönlendirme gerçekleşmez.

Kimlik doğrulama hizmeti olmasını istediğiniz herhangi bir değer olabilir. Bu örnekte, bağımlılık enjeksiyonunu kullandığınızı ve global bağımlılık çözümleyicisini yapılandırdığınızı varsayalım.senin IYourAuthService bu gibi görünebilir, göz önüne alındığında (atlayarak diğer yöntemler): bir uygulama şöyle ile

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)); 
     } 
    } 
} 

Bu, bir tablo veritabanınızda User (veya Users) olarak adlandırılan sahip olduğu varsayılır ve bu UserName ve Serial, bu tablodaki alanlar. StringComparison.OrdinalIgnoreCase, karşılaştırmaya çalıştığınız dizelerde büyük küçük harf duyarlı, kültüre duyarlı olmayan bir eşleşme yapmanıza olanak tanır.

+0

Kullanıcı tarafından girilen seri, sql tablomda bulunan seri ile nasıl karşılaştırabilirim? –

+0

Bu, "var service = ..." ile başlayan satırda ima ettiğim hizmet sınıfının sürümünüzde olur. –

+0

Tieson Bunu sorduğum için gerçekten çok üzgünüm, bildiğiniz gibi gerçekten yeni başlayan biriyim, lütfen veritabanından veri almak ve her ikisini karşılaştırmak için sorunuzu günceller misiniz? Denedim ama yukarıdaki koddan uzman seviyesine kadar hiçbir şey yakalayamadım. Çabalarınız için çok teşekkürler. Gerçekten yardımına ihtiyacım var –