Soru .NET Çekirdek Kimlik Sunucusu 4 Kimlik Doğrulaması VS Kimlik Doğrulaması


ASP.NET Çekirdeğinde kimlik doğrulaması yapmanın doğru yolunu anlamaya çalışıyorum. Birkaç Kaynak baktım (çoğu tarihli olan).

Bazı insanlar Azure AD gibi bulut tabanlı bir çözümü veya IdentityServer4'ü kullanıp kendi Token Sunucumu barındırdığını belirten alternatif çözümler sunar.

.Net'in eski sürümünde, daha basit kimlik doğrulama biçimlerinden biri, bir Özel İlk Kullanıcı oluşturmak ve içerisine ek kimlik doğrulama kullanıcı verilerini depolamak olacaktır.

public interface ICustomPrincipal : System.Security.Principal.IPrincipal
{
    string FirstName { get; set; }

    string LastName { get; set; }
}

public class CustomPrincipal : ICustomPrincipal
{
    public IIdentity Identity { get; private set; }

    public CustomPrincipal(string username)
    {
        this.Identity = new GenericIdentity(username);
    }

    public bool IsInRole(string role)
    {
        return Identity != null && Identity.IsAuthenticated && 
           !string.IsNullOrWhiteSpace(role) && Roles.IsUserInRole(Identity.Name, role);
    }

    public string FirstName { get; set; }

    public string LastName { get; set; }

    public string FullName { get { return FirstName + " " + LastName; } }
}

public class CustomPrincipalSerializedModel
{
    public int Id { get; set; }

    public string FirstName { get; set; }

    public string LastName { get; set; }
}

Sonra verilerinizi bir çerez haline getirip müşteriye geri gönderirsiniz.

public void CreateAuthenticationTicket(string username) {     

    var authUser = Repository.Find(u => u.Username == username);  
    CustomPrincipalSerializedModel serializeModel = new CustomPrincipalSerializedModel();

    serializeModel.FirstName = authUser.FirstName;
    serializeModel.LastName = authUser.LastName;
    JavaScriptSerializer serializer = new JavaScriptSerializer();
    string userData = serializer.Serialize(serializeModel);

    FormsAuthenticationTicket authTicket = new FormsAuthenticationTicket(
    1,username,DateTime.Now,DateTime.Now.AddHours(8),false,userData);
    string encTicket = FormsAuthentication.Encrypt(authTicket);
    HttpCookie faCookie = new HttpCookie(FormsAuthentication.FormsCookieName, encTicket);
    Response.Cookies.Add(faCookie);
}

Benim sorularım:

  1. Önceki sürümlerde yapılan gibi benzer bir şekilde nasıl kimlik doğrulaması yapabilirim. Net eski yöntem hala çalışıyor mu yoksa daha yeni bir sürüm var mı.

  2. Kendi jeton sunucunuzu kullanarak kendi özel prensibinizi yaratmanın artıları ve eksileri nelerdir?

  3. Bulut tabanlı bir çözüm veya ayrı bir Token sunucusu kullanırken, bunu mevcut uygulamanızla nasıl entegre edersiniz, yine de uygulamada bir kullanıcı tablosuna ihtiyaç duyardım, ikisini nasıl ilişkilendirirdiniz?

  4. Pek çok farklı çözümün olması nedeniyle, bir kuruluş uygulamasını nasıl oluşturabilirim, Gmail / Facebook üzerinden Oturum açmaya izin verirken diğer SSO'lara genişleyebilirim.

  5. Bu teknolojilerin bazı basit uygulamaları nelerdir?

42
2018-02-08 19:21


Menşei


Bu soru çok geniş ve aynı zamanda yüksek fikirli. Çok fazla olası cevap var veya bu format için iyi cevaplar çok uzun. Lütfen cevap kümesini daraltmak veya birkaç paragrafta yanıtlanabilecek bir sorunu ayırmak için ayrıntıları ekleyin. Birçok iyi soru, uzman deneyimlerine dayalı olarak bir dereceye kadar fikir üretmektedir, ancak bu sorunun cevapları gerçekler, referanslar veya özel uzmanlıktan ziyade neredeyse tamamen fikirlere dayalı olma eğilimindedir. - Nkosi
@Nkosi üzgünüm bu şekilde oldu. Daha spesifik olmak için açıklığa kavuştum - johnny 5


Cevaplar:


TL; DR

IdentityServer = OAuth 2.0 / OpenId-Connect üzerinden jeton şifreleme ve doğrulama hizmetleri

ASP.NET Kimlik = ASP.NET'te geçerli Kimlik Yönetimi stratejisi

Önceki sürümlerde yapılan gibi benzer bir şekilde nasıl kimlik doğrulaması yapabilirim. Net eski yöntem hala çalışıyor mu yoksa daha yeni bir sürüm var mı.

ASP.NET Core'da eski yolu bulamadığınız için hiçbir neden göremiyorum, ancak genel olarak bu strateji ASP.NET Identity ile değiştirildi ve ASP.NET Identity, ASP.NET Core'da canlı ve iyi durumda.

https://docs.microsoft.com/en-us/aspnet/core/security/authentication/identity

ASP.NET Identity, kullanıcı adı, parola (hashed), e-posta, telefon gibi kullanıcı bilgilerini tutmak ve FirstName, LastName veya başka herhangi bir şey için kolayca genişletmek için SQL Server gibi bir destek deposu kullanır. Yani, kullanıcı bilgilerini bir çerez içine şifrelemek ve istemciden sunucuya ileri ve geri iletmek için hiçbir neden yoktur. Kullanıcı talepleri, kullanıcı belirteçleri, kullanıcı rolleri ve harici girişler gibi kavramları destekler. ASP.NET Kimlik'teki varlıklar şunlardır:

  • AspNetUsers
  • AspNetUserRoles
  • AspNetUserClaims
  • AspNetUserLogins (Google, AAD gibi harici kimlik sağlayıcılarını bağlamak için)
  • AspNetUserTokens (kullanıcı tarafından toplanan access_tokens ve refresh_tokens gibi şeyleri depolamak için)

Kendi jeton sunucunuzu kullanarak kendi özel prensibinizi yaratmanın artıları ve eksileri nelerdir?

Bir simge sunucusu, Yetkilendirme ve / veya Kimlik Doğrulama bilgilerini içeren basit bir veri yapısı oluşturan bir sistem olacaktır. Yetkilendirme genellikle adında bir simge alır ACCESS_TOKEN. Bu, "evin anahtarları" dır, bu yüzden size kapıdan ve korunan bir kaynağın ikametgahına, genellikle bir web api'ye izin verir. Kimlik Doğrulama için id_tokenBir kullanıcı / kişi için benzersiz bir tanımlayıcı içerir. Böyle bir tanımlayıcıyı access_token içine koymak yaygın olsa da, şimdi bunu yapmak için özel bir protokol var: OpenID Bağlan.

Kendi Güvenlik Simgesi Hizmetinize (STS) sahip olmanızın nedeni, bilgi varlıklarınızı kriptografi yoluyla korumak ve hangi kaynakların (uygulamaların) bu kaynaklara erişebileceğini kontrol etmektir. Dahası, kimlik kontrolleri standartları artık OpenID-Connect özelliklerinde mevcut. IdentityServer, OpenID-Connect Authentication sunucusuyla birlikte bir OAuth 2.0 Yetkilendirme Sunucusunun bir örneğidir.

Ancak, uygulamanızda yalnızca bir kullanıcı masası istiyorsanız, bunların hiçbiri gerekli değildir. Bir simge sunucusuna ihtiyacınız yoktur - sadece ASP.NET Kimliğini kullanın. ASP.NET Kimliği, Kullanıcıyı bir ClaimsIdentity sunucudaki nesne - özel bir IPrincipal sınıfına gerek yoktur.

Bulut tabanlı bir çözüm veya ayrı bir Token sunucusu kullanırken, bunu mevcut uygulamanızla nasıl entegre edersiniz, yine de uygulamada bir kullanıcı tablosuna ihtiyaç duyardım, ikisini nasıl ilişkilendirirdiniz?

Ayrı kimlik çözümlerini bir uygulama ile entegre etmek için bu eğiticilere bakın: https://identityserver4.readthedocs.io/en/release/quickstarts/0_overview.html https://auth0.com/docs/quickstart/webapp/aspnet-core

En azından, harici tedarikçinin kullanıcı tanımlayıcısına kullanıcı adını gösteren iki sütun tablosuna ihtiyacınız olacaktır. AspNetUserLogins tablosunun ASP.NET Identity'de yaptığı şey budur. Ancak, bu tablodaki satırlar, AspNetUser'lerde Kullanıcı kaydı olma durumuna bağlıdır.

ASP.NET Identity, Google, Microsoft, Facebook gibi harici sağlayıcıları destekler, herhangi bir OpenID-Connect sağlayıcısı, Azure AD zaten var. (Google ve Microsoft, OpenID-Connect protokolünü zaten uygulamışlardır, böylece özel entegrasyon paketlerine de ihtiyacınız yoktur. Bunun gibi, Örneğin). Ayrıca, ADFS henüz ASP.NET Çekirdek Kimliği'nde bulunmamaktadır.

ASP.NET Kimliğindeki harici sağlayıcılarla çalışmaya başlamak için bu dokümana bakın:

https://docs.microsoft.com/en-us/aspnet/core/security/authentication/social/

Pek çok farklı çözümün olması nedeniyle, bir kuruluş uygulamasını nasıl oluşturabilirim, Gmail / Facebook üzerinden Oturum açmaya izin verirken diğer SSO'lara genişleyebilirim.

Yukarıda açıklandığı gibi, ASP.NET Identity zaten bunu yapıyor. Bir "Harici Sağlayıcılar" tablosu oluşturmak oldukça kolaydır ve harici giriş sürecinizi veriye aktarır. Yeni bir "SSO" geldiğinde, sağlayıcının URL'si, istemci kimliği ve size verdikleri sır gibi özelliklere sahip yeni bir satır eklemeniz yeterlidir. ASP.NET Identity, zaten Visual Studio şablonlarında yerleşik kullanıcı arayüzüne sahiptir, ancak bkz. Sosyal Giriş Daha soğuk düğmeler için.

özet

Sadece parola oturum açma yeteneklerine ve kullanıcı profiline sahip bir kullanıcı masasına ihtiyacınız varsa, ASP.NET Kimliği mükemmeldir. Dış yetkilileri dahil etmeye gerek yok. Ancak, birçok apis'e erişmeye ihtiyaç duyan birçok uygulama varsa, o zaman kimliği ve erişim belirteçleri güvenliğini sağlamak ve doğrulamak için bağımsız bir makam mantıklıdır. IdentityServer iyi bir uyum veya gör openiddict çekirdekliveya Auth0 bir bulut çözümü için.

Özür dilerim, bu işarete çarpmamak ya da çok tanıtıcıysa. Aradığınız boğa gözüne ulaşmak için lütfen iletişime geçmekten çekinmeyin.

Ek: Çerez Doğrulama

Çerezlerle çıplak kemikler kimlik doğrulaması yapmak için aşağıdaki adımları izleyin. Ancak, bilgime göre bir özel talep sorumlusu desteklenmiyor. Aynı etkiyi elde etmek için, Talepler listesinden yararlanın. ClaimPrincipal nesne.

Visual Studio 2015/2017'de iletişim kutusunda "Kimlik Doğrulama Yok" u seçerek yeni bir ASP.NET Çekirdek 1.1 Web Uygulaması oluşturun. Sonra paketi ekleyin:

Microsoft.AspNetCore.Authentication.Cookies

Altında Configure yöntem Startup.cs bunu yerleştir (önce app.UseMvc):

app.UseCookieAuthentication(new CookieAuthenticationOptions
{
    AuthenticationScheme = "MyCookieMiddlewareInstance",
    LoginPath = new PathString("/Controller/Login/"),
    AutomaticAuthenticate = true,
    AutomaticChallenge = true
});

Sonra bir giriş ui oluşturun ve bu gibi bir Eylem Yöntemine html Formu gönderin:

[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Login(String username, String password, String returnUrl = null)
{
    ViewData["ReturnUrl"] = returnUrl;
    if (ModelState.IsValid)
    {
        // check user's password hash in database
        // retrieve user info

        var claims = new List<Claim>
        {
            new Claim(ClaimTypes.Name, username),
            new Claim("FirstName", "Alice"),
            new Claim("LastName", "Smith")
        };

        var identity = new ClaimsIdentity(claims, "Password");

        var principal = new ClaimsPrincipal(identity);

        await HttpContext.Authentication.SignInAsync("MyCookieMiddlewareInstance", principal);

        return RedirectToLocal(returnUrl);
    }

    ModelState.AddModelError(String.Empty, "Invalid login attempt.");

    return View();
}

HttpContext.User nesnesinde özel hak talepleriniz olmalı ve ClaimPrincipal'ın List koleksiyonundan kolayca alınabilir.

Bu, yeterli bir Çözüm / Proje olarak bir StackOverflow yazısı için biraz fazla gibi görünüyor.


65
2018-02-27 00:07



Lütfen çekirdekte uygulama kimlik doğrulamasının bir örneğini göster - johnny 5
ASP.NET Çekirdek belgeleri, kanonik örneği gösterir: docs.microsoft.com/en-us/aspnet/core/security/authentication/.... - travis.js
Eğer basit bir kimlik doğrulama örneği gönderirseniz. İnsanların erişebilecekleri bir kaynağa sahip bir bağlantı ile, IdentityServer4'ün nasıl kurulacağına dair derinlemesine bir cevap yayınlayacağım. - johnny 5
IdentityServer için, aradığınız örnek bu mu? identityserver4.readthedocs.io/en/dev/quickstarts/... ? - travis.js
ASP.NET Kimliği için, bunun bir örneği yok mu, yoksa söylediğin şey güncel değil mi? docs.microsoft.com/en-us/aspnet/core/security/authentication/... - travis.js


TL; DR

IdentityServer4'ü düzgün bir şekilde nasıl uygulayacağınıza dair tam bir İlan göstermeyi çok isterdim ama tüm metinleri sığdırmaya çalıştım ama StackOverflow'un kabul ettiği sınırın ötesindeydi bunun yerine bazı ipuçlarını ve öğrendiklerimi doğru yapacağım.

Bir Token Sunucu Vs ASP Kimliği kullanmanın Yararları nelerdir?

Bir jeton sunucusu, çok fazla yarar var ama herkes için doğru değil. Birden çok istemcinin oturum açabilmesini istediğiniz bir çözüm gibi bir kuruluş uyguluyorsanız, Token sunucusu en iyi oyundur, ancak yalnızca Dış Girişimleri desteklemek isteyen basit bir web sitesi yaparsanız, ASP Kimlik ile Away'i alabilirsiniz ve bazı Middleware.

Kimlik Sunucusu 4 İpuçları

Kimlik sunucusu 4, gördüğüm diğer birçok çerçeveyle karşılaştırıldığında oldukça iyi belgelendi ancak sıfırdan başlamak ve tüm resmi görmek zor.

İlk hatam OAuth'ı kimlik doğrulama olarak kullanmaya çalışıyordu, Evet, bunu yapmanın yolları var ancak OpenAcConnect (OIDC) kullanımını doğrulamak istiyorsanız OAuth Yetkilendirmenin yetkilendirmesi değil

Benim durumumda, bir web api'ye bağlanan bir javascript istemcisi oluşturmak istedim. Pek çok çözüme baktım, ancak başlangıçta Web sunucusunu Kimlik Sunucusuna Karşı Kimlik Doğrulaması olarak adlandırmayı denedim ve sunucuya karşı doğrulanmış olduğundan bu belirtecin devam etmesini sağlamaya çalıştım. Bu akış potansiyel olarak işe yarayabilir ama çok fazla kusuru vardır.

Son olarak Javascript Client örneğini bulduğumda doğru akışa doğru akışı sağladım. İstemci giriş yapar ve bir belirteç belirler. Ardından, web API'nizin, IdentityServer'a karşı erişim belirtecinizi doğrulayacağınız OIdc İstemcisini kullanmasını sağlayın.

Mağazalara ve Göçlere Bağlanma İlk başta göçlerle ilgili birkaç yanlış anlaşılma vardı. Bir geçişi çalıştırdığının izlenimi altındaydım. SQL'i dahili olarak oluşturduktan sonra, SQL'i nasıl oluşturacağınızı belirlemek için Yapılandırılmış bir yapılandırmayı kullanıyorsunuz.

Bilgisayarınızın hangisini kullandığını bilerek Göçler için iki sözdizimi vardır:

dotnet ef migrations add InitialIdentityServerMigration -c ApplicationDbContext

Add-Migration InitialIdentityServerDbMigration -c ApplicationDbContext

Göç'ten sonraki parametrenin adı olduğunu düşünüyorum, neden emin olmadığın bir isme ihtiyacın var, ApplicationDbContext oluşturmak istediğiniz Code-First DbContext'tir.

Göçler, başlangıç ​​dizininizin nasıl yapılandırıldığını gösteren Bağlantı dizesi bulmak için bazı otomatik sihir kullanırlar, sadece Sunucu Gezgini'nden bir bağlantı kullandığını farz ettim.

Birden fazla projeniz varsa, projenizi ApplicationDbContext ile başlattığınızdan emin olun.

Yetkilendirme ve Kimlik Doğrulama'yı uygularken çok sayıda hareketli parça var, umarım bu yazı birisine yardımcı olur. Kimlik doğrulamayı tam olarak anlamanın en kolay yolu, örneklerini birbiriyle birleştirmek ve belgelerinizi okuduğunuzdan emin olmaktır.


3
2018-03-17 01:39



Eklemeden sonraki ad, yaptığınız yayın / değişikliklerle ilgili referanstır. Yukarı ve Aşağı geçiş komut dosyası eklemek için aynı ad kullanılacaktır. - Jay
@Jay Bu açıklama için teşekkürler - johnny 5
Identity sunucusunun yapılandırma db içeriği hala IdentityDbContext kadar iyi değil. özel uygulama oluşturmak bir acıdır. Identityserver 4 şimdi .core güncellemelerini takip eden yeni güncellemeleri yayınlamak için pek aktif değil gibi görünüyor. - Jay


Her zaman yerleşik ASP.NET Kimliğini (ve daha önce Üyelik) yetkilendirme / kimlik doğrulamasını kullandım, yakın zamanda Auth0'ı uyguladım (https://auth0.com) ve bunu denemek için başka bir şey olarak öneriyoruz.


2
2018-03-03 09:34



Auth0 .net çekirdeği örneğinin uygulanması oldukça hızlı ve basittir, ancak tüm özellikleri kullanmak adil bir iş gerektirse, birçok özelliği entegre eden Auth0'u uyguladım ve iyi çalışıyor, ama tüm bu şeyler gibi, ihtiyaçları da biraz iş ve biraz hayal kırıklığı. - Mark Redman
İyi çalışan bir kimlik doğrulama aldığımda, üzerinde derinlemesine bir cevap yayınlayacağım. Geçen haftaki kimlik doğrulama üzerinde çalışıyorum. Ve hiçbir şey olması gerektiği gibi ileriye doğru - johnny 5


Sosyal girişlerin kimlikleriyle uygulamak zor değildir, ancak bazı başlangıç ​​kurulumları vardır ve bazen dokümanlar içinde çevrimiçi olarak bulduğunuz adımlar aynı değildir, genellikle kurmaya çalıştığınız platformun geliştiriciler bölümündeki yardımı bulabilirsiniz. için sosyal girişler. Kimlik, .net framework'ün eski sürümlerinde bulunan eski üyelik işlevinin yerine geçmiştir. Şaşırtıcı bulduğum şey, bir web API'sine zaten sahip olduğunuz bir jwt jetonunu geçirme gibi kenar kullanım durumlarının çevrimiçi örneklerin herhangi bir yerinde bulunmamasıdır. çoğul halindeyken bile, bunu yapmak için kendi belirteç otoritesine ihtiyaç duymadığınızdan eminim, ancak kendiliğinden barındırılan bir sunucuyla uğraşmayan bir get veya postdaki verilerin nasıl iletileceğine dair tek bir örnek bulamadım.


0
2018-03-06 04:24



belki bundan sonra docs.identityserver.io/en/release/quickstarts/... - Jay