Aracılığıyla paylaş


ASP.NET MVC 5 uygulaması, SMS ve e-posta ile Two-Factor Kimlik Doğrulama

tarafından Rick Anderson

Bu öğreticide, Two-Factor Kimlik Doğrulamasını kullanarak bir ASP.NET MVC 5 web uygulaması nasıl oluşturabileceğinizi göreceksiniz. Devam etmeden önce oturum açma, e-posta onayı ve parola sıfırlama ile güvenli ASP.NET MVC 5 web uygulaması oluşturma tamamlamanız gerekir. Tamamlanmış uygulama buradanindirebilirsiniz. İndirme işlemi, bir e-posta veya SMS sağlayıcısı ayarlamadan e-posta onayını ve SMS'i test etmenizi sağlayan hata ayıklama yardımcılarını içerir.

Bu öğretici, Rick Anderson ( Twitter: @RickAndMSFT ) tarafından yazılmıştır.

ASP.NET MVC uygulaması oluşturma

Web veya üzeri için Visual Studio Express 2013 yükleyip çalıştırarak başlayın.

Not

Uyarı: Devam etmeden önce oturum açma, e-posta onayı ve parola sıfırlama ile güvenli ASP.NET MVC 5 web uygulaması oluşturma tamamlamanız gerekir. Bu eğitimi tamamlamak için Visual Studio 2013 Güncelleştirme 3 veya üzeri bir sürüm yüklemeniz gerekir.

  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 formları uygulamasında benzer adımları izleyebilirsiniz.
    Yeni A S P nokta NET Projesi penceresini gösteren ekran görüntüsü. Varsayılan kimlik doğrulaması olan Bireysel Kullanıcı Hesapları vurgulanır.
  2. Varsayılan kimlik doğrulamasınıBireysel Kullanıcı Hesapları olarak bırakın. Uygulamayı Azure'da barındırmak istiyorsanız onay kutusunu işaretli bırakın. Eğitimin ilerleyen bölümlerinde Azure'a dağıtacağız. Ücretsiziçin bir Azure hesabı açabilirsiniz.
  3. projesini SSLkullanacak şekilde ayarlayın.

İki öğeli kimlik doğrulaması için SMS'i ayarlama

Bu öğreticide Twilio veya ASPSMS kullanma yönergeleri sağlanır, ancak diğer SMS sağlayıcılarını kullanabilirsiniz.

  1. SMS sağlayıcısıyla Kullanıcı Hesabı Oluşturma

    Twilio veya ASPSMS hesabı oluşturun.

  2. Ekstra paketleri yükleme veya hizmet referansları ekleme

    Twilio:
    Paket Yöneticisi Konsolu'na aşağıdaki komutu girin:
    Install-Package Twilio

    ASPSMS:
    Aşağıdaki hizmet referansının eklenmesi gerekir:

    Hizmet Başvurusu Ekle penceresini gösteren ekran görüntüsü. Adres ve Ad Alanı giriş çubukları vurgulanır.

    Adres:
    https://webservice.aspsms.com/aspsmsx2.asmx?WSDL

    Namespace:
    ASPSMSX2

  3. SMS Sağlayıcısı Kullanıcı kimlik bilgilerini çözme

En güvenli güvenli kimlik doğrulama seçeneğini kullanmanızı öneririz. Azure'a dağıtılan .NET uygulamaları için bkz:

Azure Key Vault ve .NET Aspire, gizli bilgileri depolamak ve almak için en güvenli yolu sunar. Azure Key Vault, şifreleme anahtarlarını ve sertifikalar, bağlantı dizeleri ve parolalar gibi gizli dizileri koruyan bir bulut hizmetidir. .NET Aspire için bkz. Barındırma ve istemci tümleştirmeleri arasında güvenli iletişim.

Kaynak Sahibi Parola Kimlik Bilgisi Yetkilendirmesinden kaçının, çünkü:

  • Kullanıcının parolasını istemciye gösterir.
  • Önemli bir güvenlik riskidir.
  • Yalnızca diğer kimlik doğrulama akışları mümkün olmadığında kullanılmalıdır.

Uygulama bir test sunucusuna dağıtıldığında, bağlantı dizesini test veritabanı sunucusuna ayarlamak için bir ortam değişkeni kullanılabilir. Ortam değişkenleri genellikle düz, şifrelenmemiş metinde depolanır. Makine veya işlemin güvenliği ihlal edilirse ortam değişkenlerine güvenilmeyen taraflar tarafından erişilebilir. Üretim bağlantı dizesini depolamak için ortam değişkenlerini kullanmaktan kaçınmanızı öneririz çünkü bu en güvenli yaklaşım değildir.

Yapılandırma verileri yönergeleri:

  • Parolaları veya diğer hassas verileri hiçbir zaman yapılandırma sağlayıcısı kodunda veya düz metin yapılandırma dosyalarında depolamayın.
  • Geliştirme veya test ortamlarında üretim sırlarını kullanmayın.
  • Proje dışındaki gizli bilgileri belirleyerek yanlışlıkla bir kaynak kod deposuna eklenmemelerini sağlayın.

Twilio:
Twilio hesabınızın Panosu sekmesinden Hesap SID kopyalayın ve Kimlik Doğrulama belirtecinikopyalayın.

ASPSMS:
Hesap ayarlarınızdan Userkey adresine gidin ve bunu kendi tanımlı Parolaile birlikte kopyalayın.

Bu değerleri daha sonra ve "SMSAccountIdentification" anahtarları içinde "SMSAccountPassword" dosyasında depolayacağız. 4. SenderID / Kaynak Belirleme

Twilio:
Numaraları sekmesinden Twilio telefon numaranızı kopyalayın.

ASPSMS:
KaynakÇıların Kilidini Aç Menüsünde bir veya daha fazla Kaynakçının kilidini açın veya alfasayısal bir KaynakLayıcı seçin (Tüm ağlar tarafından desteklenmez).

Bu değeri daha sonra web.config dosyasında "SMSAccountFrom" anahtarı içinde depolayacağız. 5. SMS sağlayıcısı kimlik bilgilerini uygulama aktarma

Kimlik bilgilerini ve gönderen telefon numarasını uygulamanın kullanımına açın. İşleri basit tutmak için bu değerleri web.config dosyasında depolayacağız. Azure'a dağıtım yaptığımızda, web sitesi yapılandırma sekmesindeki uygulama ayarları bölümünde değerleri güvenli bir şekilde depolayabiliriz.

[!code-xml[Main](aspnet-mvc-5-app-with-sms-and-email-two-factor-authentication/samples/sample1.xml?highlight=8-10)]

> [!WARNING]
> Security - Never store sensitive data in your source code. The account and credentials are added to the code above to keep the sample simple. See [Best practices for deploying passwords and other sensitive data to ASP.NET and Azure](../../../identity/overview/features-api/best-practices-for-deploying-passwords-and-other-sensitive-data-to-aspnet-and-azure.md).
  1. SMS sağlayıcısına veri aktarımının uygulanması

    SmsService dosyasında sınıfını yapılandırın.

    Kullanılan SMS sağlayıcısına bağlı olarak Twilio veya ASPSMS bölümünü etkinleştirin:

    public class SmsService : IIdentityMessageService
    {
        public Task SendAsync(IdentityMessage message)
        {
            // Twilio Begin
            //var accountSid = ConfigurationManager.AppSettings["SMSAccountIdentification"];
            //var authToken = ConfigurationManager.AppSettings["SMSAccountPassword"];
            //var fromNumber = ConfigurationManager.AppSettings["SMSAccountFrom"];
    
            //TwilioClient.Init(accountSid, authToken);
    
            //MessageResource result = MessageResource.Create(
                //new PhoneNumber(message.Destination),
                //from: new PhoneNumber(fromNumber),
               //body: message.Body
            //);
    
            ////Status is one of Queued, Sending, Sent, Failed or null if the number is not valid
             //Trace.TraceInformation(result.Status.ToString());
            ////Twilio doesn't currently have an async API, so return success.
             //return Task.FromResult(0);    
            // Twilio End
    
            // ASPSMS Begin 
            // var soapSms = new MvcPWx.ASPSMSX2.ASPSMSX2SoapClient("ASPSMSX2Soap");
            // soapSms.SendSimpleTextSMS(
            //   System.Configuration.ConfigurationManager.AppSettings["SMSAccountIdentification"],
            //   System.Configuration.ConfigurationManager.AppSettings["SMSAccountPassword"],
            //   message.Destination,
            //   System.Configuration.ConfigurationManager.AppSettings["SMSAccountFrom"],
            //   message.Body);
            // soapSms.Close();
            // return Task.FromResult(0);
            // ASPSMS End
        }
    }
    
  2. Views\Manage\Index.cshtml Razor görünümünü güncelleştirin: (not: Yalnızca çıkış kodundaki açıklamaları kaldırmayın, aşağıdaki kodu kullanın.)

    @model MvcPWy.Models.IndexViewModel
    @{
       ViewBag.Title = "Manage";
    }
    <h2>@ViewBag.Title.</h2>
    <p class="text-success">@ViewBag.StatusMessage</p>
    <div>
       <h4>Change your account settings</h4>
       <hr />
       <dl class="dl-horizontal">
          <dt>Password:</dt>
          <dd>
             [
             @if (Model.HasPassword)
             {
                @Html.ActionLink("Change your password", "ChangePassword")
             }
             else
             {
                @Html.ActionLink("Create", "SetPassword")
             }
             ]
          </dd>
          <dt>External Logins:</dt>
          <dd>
             @Model.Logins.Count [
             @Html.ActionLink("Manage", "ManageLogins") ]
          </dd>
            <dt>Phone Number:</dt>
          <dd>
             @(Model.PhoneNumber ?? "None") [
             @if (Model.PhoneNumber != null)
             {
                @Html.ActionLink("Change", "AddPhoneNumber")
                @: &nbsp;|&nbsp;
                @Html.ActionLink("Remove", "RemovePhoneNumber")
             }
             else
             {
                @Html.ActionLink("Add", "AddPhoneNumber")
             }
             ]
          </dd>
          <dt>Two-Factor Authentication:</dt> 
          <dd>
             @if (Model.TwoFactor)
             {
                using (Html.BeginForm("DisableTwoFactorAuthentication", "Manage", FormMethod.Post, new { @class = "form-horizontal", role = "form" }))
                {
                   @Html.AntiForgeryToken()
                   <text>Enabled
                      <input type="submit" value="Disable" class="btn btn-link" />
                   </text>
                }
             }
             else
             {
                using (Html.BeginForm("EnableTwoFactorAuthentication", "Manage", FormMethod.Post, new { @class = "form-horizontal", role = "form" }))
                {
                   @Html.AntiForgeryToken()
                   <text>Disabled
                      <input type="submit" value="Enable" class="btn btn-link" />
                   </text>
                }
             }
          </dd>
       </dl>
    </div>
    
  3. EnableTwoFactorAuthentication'deki DisableTwoFactorAuthentication ve ManageController eylem metotlarının,[ValidateAntiForgeryToken] özniteliğine sahip olduğunu doğrulayın.

    //
    // POST: /Manage/EnableTwoFactorAuthentication
    [HttpPost,ValidateAntiForgeryToken]
    public async Task<ActionResult> EnableTwoFactorAuthentication()
    {
        await UserManager.SetTwoFactorEnabledAsync(User.Identity.GetUserId(), true);
        var user = await UserManager.FindByIdAsync(User.Identity.GetUserId());
        if (user != null)
        {
            await SignInAsync(user, isPersistent: false);
        }
        return RedirectToAction("Index", "Manage");
    }
    //
    // POST: /Manage/DisableTwoFactorAuthentication
    [HttpPost, ValidateAntiForgeryToken]
    public async Task<ActionResult> DisableTwoFactorAuthentication()
    {
        await UserManager.SetTwoFactorEnabledAsync(User.Identity.GetUserId(), false);
        var user = await UserManager.FindByIdAsync(User.Identity.GetUserId());
        if (user != null)
        {
            await SignInAsync(user, isPersistent: false);
        }
        return RedirectToAction("Index", "Manage");
    }
    
  4. Uygulamayı çalıştırın ve daha önce kaydettiğiniz hesapla oturum açın.

  5. Index denetleyicisinde Manage eylem yöntemini etkinleştiren Kullanıcı Kimliğinize tıklayın.
    A S P dot NET uygulaması Giriş sayfasını gösteren ekran görüntüsü. Örnek USER I D vurgulanmış.

  6. Ekle'ye tıklayın.
    A S P nokta NET uygulaması Hesap Ayarları sayfasını gösteren ekran görüntüsü. Telefon Numarası bölümüne Ekle seçeneği vurgulanmış.

  7. AddPhoneNumber eylem yöntemi, SMS mesajları alabilen bir telefon numarası girmek için bir iletişim kutusu görüntüler.

    // GET: /Account/AddPhoneNumber
    public ActionResult AddPhoneNumber()
    {
       return View();
    }
    

    A S P dot NET uygulaması Telefon Numarası Ekle sayfasını gösteren ekran görüntüsü. Örnek telefon numarası, altında Doğrulama Kodu Gönder düğmesiyle doldurulur.

  8. Birkaç saniye içinde doğrulama kodunu içeren bir kısa mesaj alırsınız. Girin ve Göndertuşuna basın.
    Örnek doğrulama kodu ve altındaki Gönder düğmesiyle doldurulmuş bir giriş çubuğunu gösteren A S P nokta NET uygulaması Telefon Numarası Ekle sayfasının ekran görüntüsü.

  9. Yönet görünümü, telefon numaranızın eklendiğini gösterir.

İki öğeli kimlik doğrulamasını etkinleştirme

Şablon tarafından oluşturulan uygulamada, iki öğeli kimlik doğrulamasını (2FA) etkinleştirmek için kullanıcı arabirimini kullanmanız gerekir. 2FA'yı etkinleştirmek için gezinti çubuğunda kullanıcı kimliğinize (e-posta diğer adı) tıklayın.

A S P nokta NET uygulaması Ana sayfasını gösteren ekran görüntüsü. Örnek Kullanıcı KİMLİĞİ vurgulanır.

2FA'yı etkinleştir'e tıklayın.

A S P nokta NET uygulaması Hesap Ayarları sayfasını gösteren ekran görüntüsü. Two-Factor Kimlik Doğrulaması: Devre dışı bırakıldı, bağlantıyı etkinleştir bölümü vurgulanmıştır.

Oturumu kapatın ve yeniden oturum açın. E-postayı etkinleştirdiyseniz (bkz. önceki öğreticim), 2FA için SMS veya e-postayı seçebilirsiniz.

A S P dot NET uygulaması Doğrulama Kodu Gönder sayfasını gösteren ekran görüntüsü. Telefon Kodu ve E-posta Kodu'nu gösteren bir açılan menü seçilidir.

Kodu girebileceğiniz Kodu Doğrula sayfası görüntülenir (SMS veya e-postadan).

A S P dot NET uygulamasının 2 FA için Doğrulama sayfasını gösteren ekran görüntüsü. Örnek kodun altında,

Bu tarayıcıyı hatırla onay kutusuna tıkladığınızda, kutuyu işaretlediğiniz tarayıcıyı ve cihazı kullanırken oturum açmak için 2FA kullanmanız gerekmeyecektir. Kötü amaçlı kullanıcılar cihazınıza erişemediği sürece, 2FA'yı etkinleştirir ve Bu tarayıcıyı hatırla'ya tıklarsanız, güvenilir olmayan cihazlardan gelen tüm erişimler için sağlam 2FA korumasını korurken size tek adımlı parola erişimi sağlar. Bunu düzenli olarak kullandığınız herhangi bir özel cihazda yapabilirsiniz.

Bu öğretici, yeni bir ASP.NET MVC uygulamasında 2FA'nın etkinleştirilmesine hızlı bir giriş sağlar. ASP.NET Identity ile SMS ve e-posta kullanarak iki öğeli kimlik doğrulaması hakkında olan numaralı öğreticim, örnekle ilgili kodun detaylarını ele alıyor.

Ek Kaynaklar