Aracılığıyla paylaş


ASP.NET Kimliği ile hesap onayı ve parola kurtarma (C#)

Bu öğreticiyi yapmadan önce oturum açma, e-posta onayı ve parola sıfırlama ile güvenli ASP.NET MVC 5 web uygulaması oluşturma öğreticisini tamamlamalısınız. Bu öğreticide daha fazla ayrıntı bulunur ve yerel hesap onayı için e-postanın nasıl ayarlanacağı ve kullanıcıların ASP.NET Identity'de unutulan parolalarını sıfırlamasına nasıl izin verileceği gösterilir.

Yerel kullanıcı hesabı, kullanıcının hesap için bir parola oluşturmasını gerektirir ve bu parola web uygulamasında (güvenli bir şekilde) depolanır. ASP.NET Kimliği, kullanıcının uygulama için parola oluşturmasını gerektirmeyen sosyal hesapları da destekler. Sosyal hesaplar kullanıcıların kimliğini doğrulamak için üçüncü taraf (Google, Twitter, Facebook veya Microsoft gibi) kullanır. Bu konu aşağıdaki konuları kapsar:

Yeni kullanıcılar, yerel bir hesap oluşturan e-posta takma adlarını kaydeder.

Hesap yazmaç penceresinin görüntüsü

Kaydet düğmesinin seçilmesi, e-posta adreslerine doğrulama belirteci içeren bir onay e-postası gönderir.

Onay gönderilen e-postayı gösteren resim

Kullanıcıya hesabı için bir onay belirteci içeren bir e-posta gönderilir.

Onay belirteci görüntüsü

Bağlantıyı seçtiğinizde hesap onaylanır.

E-posta adresini onaylayan görüntü

Parola kurtarma/sıfırlama

Parolalarını unutan yerel kullanıcılar, e-posta hesaplarına bir güvenlik belirteci göndererek parolalarını sıfırlamalarını sağlayabilir.

Parola sıfırlamayı unuttum penceresinin görüntüsü

Kullanıcı yakında parolasını sıfırlamasına izin veren bir bağlantı içeren bir e-posta alır.

parola sıfırlama e-postasını gösteren Resim
Bağlantıyı seçtiğinizde Sıfırla sayfası açılır.

Kullanıcı parola sıfırlama penceresini gösteren görüntü

Sıfırla düğmesinin seçilmesi parolanın sıfırlandığını onaylar.

Şifre sıfırlama onayını gösteren görüntüsü

ASP.NET web uygulaması oluşturma

Visual Studio 2017yükleyip çalıştırarak başlayın.

  1. Yeni bir ASP.NET Web projesi oluşturun ve MVC şablonunu seçin. Web Forms, ASP.NET Kimliğini de desteklediği için bir web forms uygulamasında benzer adımları izleyebilirsiniz.

  2. Kimlik doğrulamasını Bireysel Kullanıcı Hesaplarıolarak değiştirin.

  3. Uygulamayı çalıştırın, Kaydet bağlantısını seçin ve bir kullanıcıyı kaydedin. Bu noktada, e-posta üzerindeki tek doğrulama [EmailAddress] özniteliğidir.

  4. Sunucu Gezgini'nde, Veri Bağlantıları\DefaultConnection\Tables\AspNetUsersadresine gidin, sağ tıklayın ve tablo tanımınıaç seçin.

    Aşağıdaki görüntüde AspNetUsers şeması gösterilmektedir:

    Asp Net Users şemasını gösteren görüntü

  5. AspNetUsers tablosuna sağ tıklayın ve Tablo Verilerini Gösterseçin.

    Tablo verilerini gösteren görüntü

    Bu noktada e-posta onaylanmamıştır.

ASP.NET Identity için varsayılan veri deposu Entity Framework'dür, ancak bunu diğer veri depolarını kullanacak ve ek alanlar ekleyecek şekilde yapılandırabilirsiniz. Öğreticinin sonundaki Ek Kaynaklar bölümüne bakınız.

OWIN başlangıç sınıfı ( Startup.cs ), uygulama başlatıldığında ve App_Start\Startup.Auth.csiçinde OWIN işlem hattını yapılandıran ve ASP.NET Identity'i başlatan ConfigureAuth yöntemini çağırdığında çağrılır. ConfigureAuth yöntemini inceleyin. Her CreatePerOwinContext çağrısı, belirtilen türde bir örnek oluşturmak amacıyla her istek için bir kez çağrılmak üzere geri çağırma fonksiyonunu (OwinContext'de kaydedilen) kaydeder. Oluşturucuda ve her türün (ApplicationDbContext, ApplicationUserManager) Create yönteminde bir kesme noktası ayarlayabilir ve bunların her istekte çağrıldıklarını doğrulayabilirsiniz. ApplicationDbContext ve ApplicationUserManager örneği, uygulama genelinde erişilebilen OWIN bağlamında depolanır. ASP.NET Identity, çerez ara yazılımı aracılığıyla OWIN işlem hattına bağlanıyor. Daha fazla bilgi için bkz. UserManager sınıfı için ASP.NET Identity'de istek başına yaşam süresi yönetimi .

Güvenlik profilinizi değiştirdiğinizde yeni bir güvenlik damgası oluşturulur ve AspNetUsers tablosunun SecurityStamp alanında depolanır. SecurityStamp alanının güvenlik tanımlama bilgisinden farklı olduğunu unutmayın. Güvenlik tanımlama bilgisi AspNetUsers tablosunda (veya Kimlik Veritabanı'nda başka bir yerde) depolanmaz. Güvenlik tanımlama bilgisi belirteci, DPAPI kullanılarak otomatik olarak imzalanır ve UserId, SecurityStamp ve süre sonu bilgileriyle oluşturulur.

Tanımlama bilgisi ara yazılımı, her istekte tanımlama bilgisini denetler. Startup sınıfındaki SecurityStampValidator yöntemi db'ye isabet eder ve validateIntervalile belirtildiği gibi düzenli aralıklarla güvenlik damgasını denetler. Güvenlik profilinizi değiştirmediğiniz sürece bu yalnızca 30 dakikada bir (örneğimizde) gerçekleşir. Veritabanına yapılan yolculukları en aza indirmek için 30 dakikalık aralık seçildi. Daha fazla bilgi için iki öğeli kimlik doğrulama öğreticim bakın.

Koddaki açıklamalara göre, UseCookieAuthentication yöntemi tanımlama bilgisi kimlik doğrulamasını destekler. SecurityStamp alanı ve ilişkili kod, uygulamanıza ek bir güvenlik katmanı sağlar. Parolanızı değiştirdiğinizde oturum açtığınız tarayıcının oturumunu kapatmış olursunuz. SecurityStampValidator.OnValidateIdentity yöntemi, kullanıcı oturum açtığında uygulamanın güvenlik belirtecini doğrulamasını sağlar. Bu, parolayı değiştirdiğinizde veya dış oturum açmayı kullandığınızda kullanılır. Bu, eski parolayla oluşturulan tüm belirteçlerin (tanımlama bilgileri) geçersiz kılındığından emin olmak için gereklidir. Örnek projede, kullanıcı parolasını değiştirirseniz kullanıcı için yeni bir belirteç oluşturulur, önceki belirteçler geçersiz kılınıp SecurityStamp alanı güncelleştirilir.

Kimlik sistemi, kullanıcı güvenlik profili değiştiğinde (örneğin, kullanıcı parolasını değiştirdiğinde veya ilişkili oturum açma bilgilerini değiştirdiğinde (Facebook, Google, Microsoft hesabı vb.) kullanıcının tüm tarayıcı örneklerinde oturumunun kapatılması için uygulamanızı yapılandırmanıza olanak tanır. Örneğin, aşağıdaki görüntüde kullanıcının tek bir düğmeyi seçerek tüm tarayıcı örneklerinde (bu örnekte IE, Firefox ve Chrome) oturumunu kapatmasını sağlayan Çoklu oturum kapatma örneği uygulaması gösterilmektedir. Alternatif olarak, örnek yalnızca belirli bir tarayıcı örneğinde oturumunuzu kapatmanıza olanak tanır.

Çoklu oturum kapatma örnek uygulama penceresini gösteren görüntü

Tek oturum kapatma örneği uygulaması, ASP.NET Identity'nin güvenlik belirtecini nasıl yeniden oluşturmanızı sağladığını gösterir. Bu, eski parolayla oluşturulan tüm belirteçlerin (tanımlama bilgileri) geçersiz kılındığından emin olmak için gereklidir. Bu özellik, uygulamanıza ek bir güvenlik katmanı sağlar; parolanızı değiştirdiğinizde, bu uygulamada oturum açtığınız yerde oturumunuz kapatılır.

App_Start\IdentityConfig.cs dosyası ApplicationUserManager, EmailService ve SmsService sınıflarını içerir. EmailService ve SmsService sınıflarının her biri IIdentityMessageService arabirimini uygular, böylece her sınıfta e-posta ve SMS yapılandırmak için ortak yöntemlere sahip olursunuz. Bu öğreticide yalnızca sendGrid aracılığıyla e-posta bildiriminin nasıl ekleneceği gösterilmektedir, ancak SMTP ve diğer mekanizmaları kullanarak e-posta gönderebilirsiniz.

Startup sınıfı ayrıca sosyal medya girişleri (Facebook, Twitter, vb.) eklemek için hazır kodlar içerir. Daha fazla bilgi için Facebook, Twitter, LinkedIn ve Google OAuth2 Girişi ile MVC 5 Uygulaması öğreticim 'e bakın.

Kullanıcıların kimlik bilgilerini içeren ve aşağıdaki özellikleri yapılandıran ApplicationUserManager sınıfını inceleyin:

  • Parola gücü gereksinimleri.
  • Kullanıcı kilitleme (denemeler ve zaman).
  • İki öğeli kimlik doğrulaması (2FA). Başka bir öğreticide 2FA ve SMS'i ele alacağım.
  • E-posta ve SMS hizmetlerini bağlama. (Başka bir öğreticide SMS'i ele alacağım).

ApplicationUserManager sınıfı genel UserManager<ApplicationUser> sınıfından türetilir. ApplicationUser, IdentityUser'den türetilir. IdentityUser genel IdentityUser sınıfından türetilir:

//     Default EntityFramework IUser implementation
public class IdentityUser<TKey, TLogin, TRole, TClaim> : IUser<TKey>
   where TLogin : IdentityUserLogin<TKey>
   where TRole : IdentityUserRole<TKey>
   where TClaim : IdentityUserClaim<TKey>
{
   public IdentityUser()
   {
      Claims = new List<TClaim>();
      Roles = new List<TRole>();
      Logins = new List<TLogin>();
   }

   ///     User ID (Primary Key)
   public virtual TKey Id { get; set; }

   public virtual string Email { get; set; }
   public virtual bool EmailConfirmed { get; set; }

   public virtual string PasswordHash { get; set; }

   ///     A random value that should change whenever a users credentials have changed (password changed, login removed)
   public virtual string SecurityStamp { get; set; }

   public virtual string PhoneNumber { get; set; }
   public virtual bool PhoneNumberConfirmed { get; set; }

   public virtual bool TwoFactorEnabled { get; set; }

   ///     DateTime in UTC when lockout ends, any time in the past is considered not locked out.
   public virtual DateTime? LockoutEndDateUtc { get; set; }

   public virtual bool LockoutEnabled { get; set; }

   ///     Used to record failures for the purposes of lockout
   public virtual int AccessFailedCount { get; set; }
   
   ///     Navigation property for user roles
   public virtual ICollection<TRole> Roles { get; private set; }

   ///     Navigation property for user claims
   public virtual ICollection<TClaim> Claims { get; private set; }

   ///     Navigation property for user logins
   public virtual ICollection<TLogin> Logins { get; private set; }
   
   public virtual string UserName { get; set; }
}

Yukarıdaki özellikler, yukarıda gösterilen AspNetUsers tablosundaki özelliklerle çakışır.

IUser üzerindeki genel bağımsız değişkenler, birincil anahtar için farklı türler kullanarak bir sınıf türetmenizi sağlar. Birincil anahtarın dizeden int veya GUID'ye nasıl değiştirildiğine ilişkin ChangePK örneğine bakın.

ApplicationUser

ApplicationUser (public class ApplicationUserManager : UserManager<ApplicationUser>), Models\IdentityModels.cs içinde şu şekilde tanımlanır:

public class ApplicationUser : IdentityUser
{
    public async Task<ClaimsIdentity> GenerateUserIdentityAsync(
        UserManager<ApplicationUser> manager)
    {
        // Note the authenticationType must match the one defined in 
       //   CookieAuthenticationOptions.AuthenticationType
        var userIdentity = await manager.CreateIdentityAsync(this, 
    DefaultAuthenticationTypes.ApplicationCookie);
        // Add custom user claims here
        return userIdentity;
    }
}

Yukarıdaki vurgulanan kod, ClaimsIdentityoluşturur. ASP.NET Kimliği ve OWIN Çerez Kimlik Doğrulaması talep tabanlıdır, bu nedenle çerçeve, uygulamanın kullanıcı için bir ClaimsIdentity oluşturmasını gerektirir. ClaimsIdentity, kullanıcının adı, yaşı ve kullanıcının ait olduğu roller gibi tüm talepler hakkında bilgi içerir. Bu aşamada kullanıcı için daha fazla talep de ekleyebilirsiniz.

OWIN AuthenticationManager.SignIn yöntemi ClaimsIdentity geçirir ve kullanıcının oturum açmasını sağlar.

private async Task SignInAsync(ApplicationUser user, bool isPersistent)
{
    AuthenticationManager.SignOut(DefaultAuthenticationTypes.ExternalCookie);
    AuthenticationManager.SignIn(new AuthenticationProperties(){
       IsPersistent = isPersistent }, 
       await user.GenerateUserIdentityAsync(UserManager));
}

Facebook, Twitter, LinkedIn ve Google OAuth2 ile MVC 5 Uygulaması Oturum Açma, ApplicationUser sınıfına nasıl ek özellikler ekleyebileceğinizi gösterir.

E-posta onayı

Yeni bir kullanıcının başka birinin e-postasını kullanmadığını doğrulamak için kayıt oldukları e-posta adresini onaylamak iyi bir fikirdir. Bir tartışma forumun olduğunu varsayalım, "bob@example.com""joe@contoso.com"olarak kaydolmasını engellemek istersiniz. E-posta onayı olmadan "joe@contoso.com" uygulamanızdan istenmeyen e-postalar alabilir. Bob'un yanlışlıkla "bib@example.com" olarak kaydolduğunu ve bunu fark etmediğini varsayalım; uygulama doğru e-postaya sahip olmadığından parola kurtarmayı kullanamaz. E-posta onayı, botlara karşı yalnızca sınırlı koruma sağlar ve belirlenen spam gönderenlere karşı koruma sağlamaz, kaydolmak için kullanabilecekleri birçok çalışma e-posta diğer adına sahiptir. Aşağıdaki örnekte, kullanıcı hesabı onaylanana kadar parolasını değiştiremez (kaydolmuş olduğu e-posta hesabından alınan bir onay bağlantısını seçerek).) Bu iş akışını diğer senaryolara uygulayabilirsiniz; örneğin yönetici tarafından oluşturulan yeni hesaplarda parolayı onaylamak ve sıfırlamak için bir bağlantı göndermek, kullanıcıya profilini değiştirdiğinde bir e-posta göndermek vb. Genellikle yeni kullanıcıların e-posta, SMS kısa mesajı veya başka bir mekanizmayla onaylanana kadar web sitenize herhangi bir veri göndermesini engellemek istersiniz.

Daha eksiksiz bir örnek oluşturma

Bu bölümde, birlikte çalışacağımız daha eksiksiz bir örnek indirmek için NuGet kullanacaksınız.

  1. Yeni bir boş ASP.NET Web projesi oluşturun.

  2. Paket Yöneticisi Konsolu'nda aşağıdaki komutları girin:

    Install-Package SendGrid
    Install-Package -Prerelease Microsoft.AspNet.Identity.Samples
    

    Bu öğreticide, e-posta göndermek için SendGrid kullanacağız. Identity.Samples paketi üzerinde çalışacağımız kodu yükler.

  3. projesini SSLkullanacak şekilde ayarlayın.

  4. Uygulamayı çalıştırarak, Kaydet bağlantısını seçerek ve kayıt formunu göndererek yerel hesap oluşturmayı test edin.

  5. E-posta onayı simülasyonu yapan tanıtım e-posta bağlantısını seçin.

  6. Örnekten demo e-posta bağlantısı onay kodunu kaldırın (hesap denetleyicisindeki ViewBag.Link kodu. DisplayEmail ve ForgotPasswordConfirmation işlevlerine ve razor görünümlerine bakın).

Uyarı

Bu örnekteki güvenlik ayarlarından herhangi birini değiştirirseniz, üretim uygulamalarının yapılan değişiklikleri açıkça çağıran bir güvenlik denetiminden geçmesi gerekir.

kodu App_Start\IdentityConfig.cs içinde inceleyin

Örnek, bir hesabın nasıl oluşturulacağını ve Yönetici rolüne nasıl ekleneceğini gösterir. Örnekteki e-postayı yönetici hesabı için kullanacağınız e-postayla değiştirmeniz gerekir. Şu anda yönetici hesabı oluşturmanın en kolay yolu program aracılığıyla Seed yöntemidir. Gelecekte kullanıcıları ve rolleri oluşturup yönetmenizi sağlayacak bir aracımız olmasını umuyoruz. Örnek kod, kullanıcıları ve rolleri oluşturmanıza ve yönetmenize olanak tanır, ancak önce rolleri ve kullanıcı yöneticisi sayfalarını çalıştırmak için bir yönetici hesabınız olmalıdır. Bu örnekte, veritabanı ilk veriyle doldurulduğunda yönetici hesabı oluşturulur.

Parolayı değiştirin ve adı e-posta bildirimleri alabileceğiniz bir hesapla değiştirin.

Uyarı

Güvenlik : Hassas verileri hiçbir zaman kaynak kodunuzda depolamayın.

Daha önce belirtildiği gibi, başlangıç sınıfındaki app.CreatePerOwinContext çağrısı, uygulama veritabanı içeriğinin, kullanıcı yöneticisinin ve rol yöneticisi sınıflarının Create yöntemine geri çağırmalar ekler. OWIN işlem hattı, her istek için bu sınıflarda Create yöntemini çağırır ve her sınıfın bağlamını depolar. Hesap denetleyicisi, kullanıcı yöneticisini HTTP bağlamından (OWIN bağlamını içeren) kullanıma sunar:

public ApplicationUserManager UserManager
{
    get
    {
        return _userManager ?? 
    HttpContext.GetOwinContext().GetUserManager<ApplicationUserManager>();
    }
    private set
    {
        _userManager = value;
    }
}

Kullanıcı yerel bir hesap kaydettirdiğinde HTTP Post Register yöntemi çağrılır:

[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
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);
        if (result.Succeeded)
        {
            var code = await UserManager.GenerateEmailConfirmationTokenAsync(user.Id);
            var callbackUrl = Url.Action(
               "ConfirmEmail", "Account", 
               new { userId = user.Id, code = code }, 
               protocol: Request.Url.Scheme);

            await UserManager.SendEmailAsync(user.Id, 
               "Confirm your account", 
               "Please confirm your account by clicking this link: <a href=\"" 
                                               + callbackUrl + "\">link</a>");
            // ViewBag.Link = callbackUrl;   // Used only for initial demo.
            return View("DisplayEmail");
        }
        AddErrors(result);
    }

    // If we got this far, something failed, redisplay form
    return View(model);
}

Yukarıdaki kod, girilen e-postayı ve parolayı kullanarak yeni bir kullanıcı hesabı oluşturmak için model verilerini kullanır. E-posta diğer adı veri deposundaysa hesap oluşturma işlemi başarısız olur ve form yeniden görüntülenir. GenerateEmailConfirmationTokenAsync yöntemi güvenli bir onay belirteci oluşturur ve ASP.NET Identity veri deposunda depolar. Url.Action yöntemi, UserId ve onay belirtecini içeren bir bağlantı oluşturur. Bu bağlantı daha sonra kullanıcıya e-postayla gönderilir, kullanıcı hesabını onaylamak için e-posta uygulamasındaki bağlantıyı seçebilir.

E-posta onayı ayarlama

SendGrid kaydolma sayfasına gidin ve ücretsiz hesaba kaydolun. SendGrid'i yapılandırmak için aşağıdakine benzer bir kod ekleyin:

public class EmailService : IIdentityMessageService
{
   public Task SendAsync(IdentityMessage message)
   {
      return configSendGridasync(message);
   }

   private Task configSendGridasync(IdentityMessage message)
   {
      var myMessage = new SendGridMessage();
      myMessage.AddTo(message.Destination);
      myMessage.From = new System.Net.Mail.MailAddress(
                          "Joe@contoso.com", "Joe S.");
      myMessage.Subject = message.Subject;
      myMessage.Text = message.Body;
      myMessage.Html = message.Body;

      var credentials = new NetworkCredential(
                 ConfigurationManager.AppSettings["mailAccount"],
                 ConfigurationManager.AppSettings["mailPassword"]
                 );

      // Create a Web transport for sending email.
      var transportWeb = new Web(credentials);

      // Send the email.
      if (transportWeb != null)
      {
         return transportWeb.DeliverAsync(myMessage);
      }
      else
      {
         return Task.FromResult(0);
      }
   }
}

Not

E-posta istemcileri genellikle yalnızca kısa mesajları (HTML yok) kabul etmektedir. İletiyi metin ve HTML olarak sağlamanız gerekir. Yukarıdaki SendGrid örneğinde, bu işlem yukarıda gösterilen myMessage.Text ve myMessage.Html koduyla yapılır.

Aşağıdaki kod, message.Body yalnızca bağlantıyı döndürdüğü MailMessage sınıfını kullanarak e-posta göndermeyi gösterir.

void sendMail(Message message)
{
#region formatter
   string text = string.Format("Please click on this link to {0}: {1}", message.Subject, message.Body);
   string html = "Please confirm your account by clicking this link: <a href=\"" + message.Body + "\">link</a><br/>";

   html += HttpUtility.HtmlEncode(@"Or click on the copy the following link on the browser:" + message.Body);
#endregion

   MailMessage msg = new MailMessage();
   msg.From = new MailAddress("joe@contoso.com");
   msg.To.Add(new MailAddress(message.Destination));
   msg.Subject = message.Subject;
   msg.AlternateViews.Add(AlternateView.CreateAlternateViewFromString(text, null, MediaTypeNames.Text.Plain));
   msg.AlternateViews.Add(AlternateView.CreateAlternateViewFromString(html, null, MediaTypeNames.Text.Html));

   SmtpClient smtpClient = new SmtpClient("smtp.gmail.com", Convert.ToInt32(587));
   System.Net.NetworkCredential credentials = new System.Net.NetworkCredential("joe@contoso.com", "XXXXXX");
   smtpClient.Credentials = credentials;
   smtpClient.EnableSsl = true;
   smtpClient.Send(msg);
}

Uyarı

Güvenlik : Hassas verileri hiçbir zaman kaynak kodunuzda depolamayın. Hesap ve kimlik bilgileri appSetting içinde depolanır. Azure'da, bu değerleri Azure portalındaki Yapılandır sekmesinde güvenli bir şekilde depolayabilirsiniz. Bkz. Parolaları ve diğer hassas verileri ASP.NET ve Azuredağıtmaya yönelik en iyi yöntemler.

SendGrid kimlik bilgilerinizi girin, uygulamayı çalıştırın, bir e-posta takma adıyla kaydolun ve e-postanızdaki onay bağlantısını seçin. Bunun Outlook.com e-posta hesabınızla nasıl yapılacağını görmek için bkz. John Atten'in Outlook.Com SMTP Ana Bilgisayarı için C# SMTP Yapılandırması veASP.NET Kimliği 2.0: Hesap Doğrulamayı Ayarlama ve Yetkilendirme gönderilerini Two-Factor.

Kullanıcı Kaydet düğmesini seçtiğinde, e-posta adresine doğrulama belirteci içeren bir onay e-postası gönderilir.

Gönderilen e-posta onay penceresinin resmi

Kullanıcıya hesabı için bir onay belirteci içeren bir e-posta gönderilir.

Alınan e-postanın görüntüsü

Kodu inceleme

Aşağıdaki kodda POST ForgotPassword yöntemi gösterilmektedir.

public async Task<ActionResult> ForgotPassword(ForgotPasswordViewModel model)
{
    if (ModelState.IsValid)
    {
        var user = await UserManager.FindByNameAsync(model.Email);
        if (user == null || !(await UserManager.IsEmailConfirmedAsync(user.Id)))
        {
            // Don't reveal that the user does not exist or is not confirmed
            return View("ForgotPasswordConfirmation");
        }

        var code = await UserManager.GeneratePasswordResetTokenAsync(user.Id);
        var callbackUrl = Url.Action("ResetPassword", "Account", 
    new { UserId = user.Id, code = code }, protocol: Request.Url.Scheme);
        await UserManager.SendEmailAsync(user.Id, "Reset Password", 
    "Please reset your password by clicking here: <a href=\"" + callbackUrl + "\">link</a>");        
        return View("ForgotPasswordConfirmation");
    }

    // If we got this far, something failed, redisplay form
    return View(model);
}

Kullanıcı e-postası onaylanmamışsa yöntem sessizce başarısız olur. Geçersiz bir e-posta adresi için hata gönderildiyse, kötü amaçlı kullanıcılar saldırı için geçerli userId (e-posta diğer adları) bulmak için bu bilgileri kullanabilir.

Aşağıdaki kod, hesap denetleyicisinde kullanıcı kendilerine gönderilen e-postada onay bağlantısını seçtiğinde çağrılan ConfirmEmail yöntemini gösterir:

public async Task<ActionResult> ConfirmEmail(string userId, string code)
{
    if (userId == null || code == null)
    {
        return View("Error");
    }
    var result = await UserManager.ConfirmEmailAsync(userId, code);
    if (result.Succeeded)
    {
        return View("ConfirmEmail");
    }
    AddErrors(result);
    return View();
}

Unutulmuş bir parola belirteci kullanıldıktan sonra geçersiz hale gelir. Create yönteminde aşağıdaki kod değişikliği (App_Start\IdentityConfig.cs dosyasında) belirteçlerin süresinin 3 saat içinde dolmasına neden olur.

if (dataProtectionProvider != null)
 {
    manager.UserTokenProvider =
       new DataProtectorTokenProvider<ApplicationUser>
          (dataProtectionProvider.Create("ASP.NET Identity"))
          {                    
             TokenLifespan = TimeSpan.FromHours(3)
          };
 }

Yukarıdaki kod sayesinde, unutulmuş parola ve e-posta onay belirteçleri 3 saat sonra sona erecek. Varsayılan TokenLifespan bir gündür.

Aşağıdaki kod, e-posta onay yöntemini gösterir:

// GET: /Account/ConfirmEmail
[AllowAnonymous]
public async Task<ActionResult> ConfirmEmail(string userId, string code)
{
   if (userId == null || code == null)
   {
      return View("Error");
   }
   IdentityResult result;
   try
   {
      result = await UserManager.ConfirmEmailAsync(userId, code);
   }
   catch (InvalidOperationException ioe)
   {
      // ConfirmEmailAsync throws when the userId is not found.
      ViewBag.errorMessage = ioe.Message;
      return View("Error");
   }

   if (result.Succeeded)
   {
      return View();
   }

   // If we got this far, something failed.
   AddErrors(result);
   ViewBag.errorMessage = "ConfirmEmail failed";
   return View("Error");
}

Uygulamanızı daha güvenli hale getirmek için ASP.NET Identity, Two-Factor kimlik doğrulamasını (2FA) destekler. Bkz. ASP.NET Identity 2.0: Hesap Doğrulamayı Ayarlama ve Yetkilendirme Two-Factor John Atten tarafından. Oturum açma parolası deneme hatalarında hesap kilitlemeyi ayarlayabilirsiniz ancak bu yaklaşım, oturum açma işleminizi DOS kilitlemelerine karşı hassas hale getirir. Hesap kilitlemeyi yalnızca 2FA ile kullanmanızı öneririz.

Ek kaynaklar