.NET Core Kimlik Sunucusu 4 Kimlik Doğrulaması VS Kimlik Kimlik Doğrulaması


92

ASP.NET Core'da kimlik doğrulaması yapmanın doğru yolunu anlamaya çalışıyorum. Birkaç Kaynağa baktım (çoğu eski tarihli).

Bazı kişiler Azure AD gibi bulut tabanlı bir çözüm kullanmayı veya IdentityServer4'ü kullanıp kendi Token Sunucumu barındırmayı belirten alternatif çözümler sunar.

.Net'in Eski sürümünde, kimlik doğrulamanın daha basit biçimlerinden biri, bir Özel I ilkesi oluşturmak ve ek kimlik doğrulama kullanıcı verilerini içinde 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; }
}

Ardından, verilerinizi bir tanımlama bilgisine Seri hale 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);
}

Sorularım:

  1. .Net'in önceki sürümlerinde yapılana benzer şekilde nasıl kimlik doğrulaması yapabilirim eski yöntem hala çalışıyor veya daha yeni bir sürüm var mı?

  2. Kendi özel prensibinizi oluşturmak için kendi jeton sunucu dizilerinizi kullanmanın artıları ve eksileri nelerdir?

  3. Bulut tabanlı bir çözüm veya ayrı bir Token sunucusu kullanırken, bunu mevcut uygulamanıza nasıl entegre edersiniz, yine de uygulamamda bir kullanıcı tablosuna ihtiyacım olur mu, ikisini nasıl ilişkilendirirsiniz?

  4. Pek çok farklı çözüm olduğu için, diğer SSO'lara genişlemeye devam ederken Gmail / Facebook üzerinden Giriş yapmanıza izin vermek için kurumsal bir uygulamayı nasıl oluşturabilirim

  5. Bu teknolojilerin bazı basit uygulamaları nelerdir?

Bu soru çok geniş ve aynı zamanda oldukça fikirlere dayalıdır. Ya çok fazla olası cevap var ya da bu format için iyi cevaplar çok uzun. Lütfen yanıt kümesini daraltmak veya birkaç paragrafta yanıtlanabilecek bir sorunu diğerlerinden ayırmak için ayrıntılar ekleyin. Pek çok iyi soru, uzman deneyimine dayalı bir dereceye kadar fikir üretir, ancak bu sorunun yanıtları, gerçekler, referanslar veya belirli uzmanlıklardan ziyade neredeyse tamamen fikirlere dayalı olma eğiliminde olacaktır.
Nkosi

@Nkosi üzgünüm ifade bu şekilde oldu. Bunu daha spesifik olacak şekilde açıkladım
Johnny 5

Yanıtlar:


145

TL; DR

IdentityServer = OAuth 2.0 / OpenId-Connect aracılığıyla belirteç şifreleme ve doğrulama hizmetleri

ASP.NET Identity = ASP.NET'teki mevcut Kimlik Yönetimi stratejisi

.Net'in önceki sürümlerinde yapılana benzer şekilde nasıl kimlik doğrulaması yapabilirim eski yöntem hala çalışıyor veya daha yeni bir sürüm var mı?

ASP.NET Core'da eski yolu başaramamanı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.

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

ASP.NET Identity, kullanıcı adı, parola (karma), e-posta, telefon gibi kullanıcı bilgilerini tutmak için SQL Server gibi bir destek deposu kullanır ve Ad, Soyad veya başka herhangi bir şeyi tutacak şekilde kolayca genişletilebilir. Dolayısıyla, kullanıcı bilgilerini bir tanımlama bilgisine şifrelemek ve istemciden sunucuya iletmek için hiçbir neden yoktur. Kullanıcı talepleri, kullanıcı jetonları, kullanıcı rolleri ve harici oturum açma gibi kavramları destekler. ASP.NET Identity'deki varlıklar:

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

Kendi özel prensibinizi oluşturmak için kendi jeton sunucu dizilerinizi kullanmanın artıları ve eksileri nelerdir?

Bir belirteç sunucusu, Yetkilendirme ve / veya Kimlik Doğrulama bilgilerini içeren basit bir veri yapısı oluşturan bir sistem olacaktır. Yetkilendirme genellikle access_token adlı bir token alır . Bu, tabiri caizse "evin anahtarları" olacaktır, kapı aralığından geçip korunan bir kaynağın, genellikle bir web api'sinin evine girmenizi sağlar. Kimlik Doğrulama için, id_tokenbir kullanıcı / kişi için benzersiz bir tanımlayıcı içerir. Erişim belirtecine böyle bir tanımlayıcı koymak yaygın olsa da, artık bunu yapmak için özel bir protokol var: OpenID-Connect .

Kendi Güvenlik Simgesi Hizmetinize (STS) sahip olmanın nedeni, bilgi varlıklarınızı kriptografi yoluyla korumak ve hangi müşterilerin (uygulamaların) bu kaynaklara erişebileceğini kontrol etmektir. Ayrıca, kimlik kontrolleri için standartlar artık OpenID-Connect belirtimlerinde mevcuttur. IdentityServer, OpenID-Connect Kimlik Doğrulama sunucusuyla birleştirilmiş bir OAuth 2.0 Yetkilendirme Sunucusu örneğidir.

Ancak uygulamanızda sadece bir kullanıcı tablosu istiyorsanız bunların hiçbiri gerekli değildir. Bir belirteç sunucusuna ihtiyacınız yoktur - sadece ASP.NET Identity kullanın. ASP.NET Identity, Kullanıcınızı sunucudaki ClaimsIdentity nesnesiyle eşler ; özel bir IPrincipal sınıfına gerek yoktur.

Bulut tabanlı bir çözüm veya ayrı bir Token sunucusu kullanırken, bunu mevcut uygulamanıza nasıl entegre edersiniz, yine de uygulamamda bir kullanıcı tablosuna ihtiyacım olur mu, ikisini nasıl ilişkilendirirsiniz?

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

En azından, kullanıcı adını harici sağlayıcının kullanıcı tanımlayıcısına eşleyen iki sütunlu bir tabloya ihtiyacınız olacaktır. AspNetUserLogins tablosunun ASP.NET Identity'de yaptığı şey budur. Ancak bu tablodaki satırlar AspNetUsers'da bir Kullanıcı kaydı olmasına 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 oradadır. (Google ve Microsoft zaten OpenID-Connect protokolünü uygulamıştır, bu nedenle örneğin bunun gibi özel entegrasyon paketlerine de ihtiyacınız yoktur ). Ayrıca ADFS, ASP.NET Core Identity'de henüz kullanılamamaktadır.

ASP.NET Identity'de harici sağlayıcılarla başlamak için bu belgeye bakın:

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

Pek çok farklı çözüm olduğu için, diğer SSO'lara genişlemeye devam ederken Gmail / Facebook üzerinden Giriş yapmanıza izin vermek için kurumsal bir uygulamayı nasıl oluşturabilirim

Yukarıda açıklandığı gibi, ASP.NET Identity bunu zaten yapıyor. "Harici Sağlayıcılar" tablosu oluşturmak oldukça kolaydır ve harici oturum açma sürecinizi veri yönlendirir. Bu nedenle, yeni bir "SSO" geldiğinde, sağlayıcının url'si, müşteri kimliği ve size verdikleri sır gibi özellikleri içeren yeni bir satır ekleyin. ASP.NET Identity zaten Visual Studio şablonlarında yerleşik kullanıcı arabirimine sahiptir, ancak daha soğuk düğmeler için Sosyal Oturum Açma bölümüne bakın .

Özet

Yalnızca parola oturum açma özelliklerine ve bir kullanıcı profiline sahip bir kullanıcı tablosuna ihtiyacınız varsa, ASP.NET Identity mükemmeldir. Dış yetkilileri dahil etmeye gerek yok. Ancak, birçok API'ye erişmesi gereken birçok uygulama varsa, kimlik ve erişim belirteçlerini güvence altına almak ve doğrulamak için bağımsız bir otorite mantıklıdır. IdentityServer iyi bir seçimdir veya bir bulut çözümü için openiddict-core veya Auth0'a bakın.

Özür dilerim, bu hedefe ulaşmak değil ya da çok tanıtıcıysa. Lütfen aradığınız hedefe ulaşmak için etkileşimde bulunmaktan çekinmeyin.

Ek: Çerez Kimlik Doğrulaması

Tanımlama bilgileriyle çıplak kemik kimlik doğrulaması yapmak için aşağıdaki adımları izleyin. Ancak, bildiğim kadarıyla bir özel talepler müdürü desteklenmiyor. Aynı etkiyi elde etmek için, ClaimPrincipalnesnenin Talepler listesini kullanın .

İletişim kutusunda "Kimlik Doğrulaması Yok" seçeneğini seçerek Visual Studio 2015 / 2017'de yeni bir ASP.NET Core 1.1 Web Uygulaması oluşturun. Ardından paketi ekleyin:

Microsoft.AspNetCore.Authentication.Cookies

Altında Configureiçinde yönteme Startup.csyerde bu (önceki app.UseMvc):

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

Ardından bir oturum açma kullanıcı arabirimi oluşturun ve html Formunu aşağıdaki gibi bir Eylem Yöntemine 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 nesnesi, özel taleplerinize sahip olmalıdır ve ClaimPrincipal.

Umarım bu yeterlidir, çünkü tam bir Çözüm / Proje bir StackOverflow gönderisi için biraz fazla görünmektedir.


1
Lütfen çekirdekte kimlik doğrulama uygulamasının bir örneğini gösterin
johnny 5

2
ASP.NET Core belgeleri standart örneği gösterir: docs.microsoft.com/en-us/aspnet/core/security/authentication/… .
travis.js

Lütfen basit bir kimlik doğrulama örneği gönderebilirseniz. İnsanların erişebilecekleri bir kaynağa sahip olmaları için bir bağlantı ile, IdentityServer4'ün nasıl kurulacağına dair derinlemesine bir cevap göndereceğim
johnny 5

IdentityServer için, aradığınız örnek bu mu : Identityserver4.readthedocs.io/en/dev/quickstarts/… ?
travis.js

ASP.NET Identity için, bunun bir örneği yok mu, yoksa söylediğiniz şey güncel değil mi? docs.microsoft.com/en-us/aspnet/core/security/authentication/…
travis.js

11

TL; DR

IdentityServer4'ü doğru bir şekilde nasıl uygulayacağıma dair Tam bir gönderi göstermek istiyorum, ancak Tüm Metni sığdırmaya çalıştım, ancak StackOverflow'un Kabul ettiği sınırın ötesindeydi, bunun yerine öğrendiğim bazı ipuçlarını ve şeyleri düzelteceğim.

Token Sunucusu Vs ASP Kimliği kullanmanın faydaları nelerdir?

Bir jeton sunucusunun birçok faydası vardır, ancak herkes için doğru değildir. Birden fazla istemcinin oturum açabilmesini istediğiniz kurumsal benzeri bir çözüm uyguluyorsanız, Token sunucusu en iyi seçeneğinizdir, ancak yalnızca Harici Girişleri desteklemek isteyen basit bir web sitesi yapıyorsanız, ASP Kimliği ile Uzaklaşabilirsiniz ve bazı Middleware.

Kimlik Sunucusu 4 İpuçları

Identity server 4, gördüğüm diğer birçok çerçeveye kıyasla oldukça iyi belgelenmiştir, ancak sıfırdan başlamak ve resmin tamamını görmek zor.

İlk hatam, OAuth'u kimlik doğrulama olarak kullanmaya çalışıyordu, Evet, bunu yapmanın yolları var, ancak OAuth, Kimlik Doğrulama için değil, Kimlik Doğrulaması için OpenIdConnect (OIDC) kullanmak istiyorsanız

Benim durumumda, bir web api'sine bağlanan bir javascript istemcisi oluşturmak istedim. Pek çok çözüme baktım, ancak başlangıçta Kimlik Sunucusuna Karşı Kimlik Doğrulama'yı çağırmak için webapi'yi kullanmaya çalıştım ve sunucuya karşı doğrulandığı için bu simgenin kalıcı olmasını sağlayacaktım. Bu akış potansiyel olarak işe yarayabilir, ancak birçok kusuru vardır.

Sonunda, Javascript İstemci örneğini bulduğumda doğru akışı doğru akışı elde ettim. Müşteri oturum açar ve bir belirteç belirler. Ardından, web api'nizin OIdc İstemcisini kullanmasını sağlarsınız, bu da IdentityServer'a karşı erişim belirteci olduğunuzu doğrulayacaktır.

Mağazalara ve Taşıma İşlemlerine Bağlanma İlk başta geçişlerle ilgili birçok yanlış anlamam vardı. SQL'in nasıl oluşturulacağını anlamak için Context'i kullanmak yerine, SQL'i dahili olarak dll'den oluşturduğunuzu düşünüyordum.

Bilgisayarınızın hangisini kullandığının önemli olduğunu bilen Geçişler için iki sözdizimi vardır:

dotnet ef migrations add InitialIdentityServerMigration -c ApplicationDbContext

Add-Migration InitialIdentityServerDbMigration -c ApplicationDbContext

Bence Migration'dan sonraki parametre isimdir, neden bir isme ihtiyacınız olduğundan emin değilim, ApplicationDbContextoluşturmak istediğiniz Code-First DbContext.

Geçişler, başlangıç ​​ayarınızın nasıl yapılandırıldığına bağlı olarak Bağlantı dizesi olduğunuzu bulmak için bazı otomatik sihir kullanır, Sunucu Gezgini'nden bir bağlantı kullandığını varsaydım.

Birden fazla projeniz varsa, başlangıç ​​olarak ApplicationDbContext ayarlı projeye sahip olduğunuzdan emin olun.

Yetkilendirme ve Kimlik Doğrulamayı uygularken çok sayıda hareketli parça var, Umarım bu yazı birine yardımcı olur. Kimlik doğrulamalarını tam olarak anlamanın en kolay yolu, her şeyi bir araya getirmek için örneklerini ayırmak ve belgeleri okuduğunuzdan emin olmaktır.


eklenti geçişinden sonraki ad, sürümünüzle / yaptığınız değişikliklerle ilgili referanstır. Yukarı ve Aşağı taşıma komut dosyası eklemek için aynı ad kullanılacaktır.
Jay

@Jay Açıklama için teşekkürler
johnny 5

Kimlik sunucusunun yapılandırma veritabanı bağlamı, hala IdentityDbContext kadar iyi değil. özel uygulama oluşturmak bir acıdır. Identityserver 4, .core güncellemelerinin ardından yeni güncellemeler yayınlamak için artık pek aktif görünmüyor.
Jay

3

ASP.NET Kimliği - bu, uygulamanızın Taşıyıcı veya Temel Kimlik Doğrulaması olup olmadığını doğrulamak için bir yol olup, Kullanıcı kaydı, oturum açma, şifre değiştirme ve tüm işlemleri gerçekleştirmek için bize hazır kodu verir.

Şimdi 10 farklı uygulamamız olduğunu ve 10 uygulamanın hepsinde aynı şeyi yapmanın mümkün olmadığını düşünün. bu çok kırılgan ve çok kötü bir uygulama.

Bu sorunu çözmek için yapabileceğimiz şey, Kimlik Doğrulamamızı ve yetkilendirmemizi merkezileştirmektir, böylece bu konudaki herhangi bir değişiklik 10 uygulamamızı etkilemez.

Kimlik sunucusu size aynı şeyi yapma olanağı sağlar. Sadece Kimlik hizmeti olarak kullanılan bir örnek web uygulaması oluşturabiliriz ve kullanıcınızı doğrulayacak ve bazı JWT erişim belirteci sağlayacaktır.


2

Her zaman yerleşik ASP.NET Kimliği (ve daha önce Üyelik) yetkilendirmesini / 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 öneriyorum.


Auth0 .net çekirdek örneğinin uygulanması oldukça hızlı ve basittir, ancak tüm özellikleri kullanmak epey bir çalışma gerektirir, birçok özelliği entegre ederek Auth0'ı uyguladım ve iyi çalışıyor, ancak tüm bunlar gibi ihtiyaçları da var biraz çalışma ve biraz hayal kırıklığı.
Mark Redman

İyi çalışan bir kimlik doğrulaması aldığımda, bunun üzerine derinlemesine bir cevap göndereceğim. Geçen hafta kimlik doğrulama üzerinde çalışıyorum. Ve hiçbir şey olması gerektiği kadar ileriye
gitmiyor

0

Sosyal girişlerin Identity ile uygulanması zor değildir, ancak bazı ilk kurulumlar söz konusudur ve bazen belgelerde çevrimiçi bulduğunuz adımlar aynı değildir, genellikle bunun için kurmaya çalıştığınız platformun geliştiriciler bölümünde yardım bulabilirsiniz. için sosyal girişler. Kimlik, .net çerçevesinin eski sürümlerinde bulunan eski üyelik işlevinin değiştirilmesidir. Şaşırtıcı bulduğum şey, zaten sahip olduğunuz bir jwt belirtecini bir web api'ye geçirmek gibi uç kullanım durumlarının çevrimiçi örneklerde hiçbir yerde ele alınmamasıdır. çoğul görüşte bile, bunu yapmak için kendi simge yetkinize ihtiyacınız olmadığından eminim, ancak kendi kendine barındırılan bir sunucuyla ilgilenmeyen bir alma veya postada verilerin nasıl aktarılacağına dair tek bir örnek bulamadım.


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.