📜  ASP.NET WP-安全性

📅  最后修改于: 2020-11-21 05:36:11             🧑  作者: Mango


在本章中,我们将介绍如何保护网站的安全性,以便某些页面仅对登录的用户可用。要保护您的网站,可以创建网站,以便用户可以登录。出于多种原因,保护您的网站很有用。

  • 您的站点可能包含仅对成员可用的页面。

  • 有时,您会要求用户登录,以便他们可以发送反馈或在您的网站上发表评论。

  • 如果用户未登录,则他们仍然可以浏览某些页面,但不是全部。

  • 未登录的用户称为匿名用户

如何通过身份验证保护网站?

用户首先需要在您的网站上注册,然后才能登录到该网站。要在网站上注册,用户将需要一个用户名,一个电子邮件地址以及一个密码,以确认该用户就是他们声称的身份。登录并确认用户身份的过程称为身份验证

WebMatrix提供了一个称为Starter Site的内置模板来创建网站,该模板包含以下属性。

  • 一个可以存储用户名和密码的数据库。

  • 用户可以在其中注册的注册页面。

  • 登录/注销页面。

  • 密码恢复和重置页面。

让我们通过创建一个新的入门网站来研究一个简单的示例。

模板中的网站

在“站点名称”字段中输入SecurityDemo ,然后单击“下一步”。这将安装和配置所需的软件包。

安装完成后,让我们运行该应用程序,您将看到以下网页。

主页

如您所见,页面右上方有两个按钮Register and Login

让我们单击“注册”链接,您将看到以下网页,您可以通过提供以下信息来进行注册。

寄存器

这是网站上Account文件夹下的实现Register.cshtml文件。

@ *如果使用捆绑包,请删除此部分* @

@section Scripts {
   
   
}
@{
   Layout = "~/_SiteLayout.cshtml";
   Page.Title = "Register";
   
   // Initialize general page variables
   var email = "";
   var password = "";
   var confirmPassword = "";
   
   // Setup validation
   Validation.RequireField("email", "You must specify an email address.");
   Validation.RequireField("password", "Password cannot be blank.");
   Validation.Add("confirmPassword",
   Validator.EqualsTo("password", "Password and confirmation password do not match."));
   Validation.Add("password",
      Validator.StringLength(
         maxLength: Int32.MaxValue,
         minLength: 6,
         errorMessage: "Password must be at least 6 characters"));
   
   // If this is a POST request, validate and process data
   if (IsPost) {
      AntiForgery.Validate();
      email = Request.Form["email"];
      password = Request.Form["password"];
      confirmPassword = Request.Form["confirmPassword"];
      
      // Validate the user's captcha answer
      // if (!ReCaptcha.Validate("PRIVATE_KEY")) {
         // ModelState.AddError("recaptcha", "Captcha response was not correct");
      // }
     
      // If all information is valid, create a new account
      if (Validation.IsValid()) {
         // Insert a new user into the database
         var db = Database.Open("StarterSite");
         
         // Check if user already exists
         var user = db.QuerySingle("SELECT Email FROM UserProfile WHERE LOWER(Email) =
            LOWER(@0)", email);
         
         if (user == null) {
            // Insert email into the profile table
            db.Execute("INSERT INTO UserProfile (Email) VALUES (@0)", email);
            // Create and associate a new entry in the membership database.
            // If successful, continue processing the request
            
            try {
               bool requireEmailConfirmation = !WebMail.SmtpServer.IsEmpty();
               var token = WebSecurity.CreateAccount(email, password, 
                  requireEmailConfirmation);
               
               if (requireEmailConfirmation) {
                  var hostUrl = Request.Url.GetComponents(UriComponents.SchemeAndServer,
                     UriFormat.Unescaped);
                  var confirmationUrl = hostUrl + VirtualPathUtility.ToAbsolute
                     ("~/Account/Confirm?confirmationCode = " 
                     + HttpUtility.UrlEncode(token));
                  WebMail.Send(
                     to: email,
                     subject: "Please confirm your account",
                     body: "Your confirmation code is: " + token + ". 
                     Visit " + 
                     confirmationUrl + " to activate your account."
                  );
               }
               
               if (requireEmailConfirmation) {
                  // Thank the user for registering and let them know an 
                     email is on its way
                  Response.Redirect("~/Account/Thanks");
               } else {
                  // Navigate back to the homepage and exit
                  WebSecurity.Login(email, password);
                  Response.Redirect("~/");
               }
            }catch (System.Web.Security.MembershipCreateUserException e) {
               ModelState.AddFormError(e.Message);
            }
         } else {
            // User already exists
            ModelState.AddFormError("Email address is already in use.");
         }
      }
   }
}

@Page.Title.

Create a new account.

@AntiForgery.GetHtml() @* If at least one validation error exists, notify the user *@ @Html.ValidationSummary("Account creation was unsuccessful. Please correct the errors and try again.", excludeFieldErrors: true, htmlAttributes: null)
Registration Form
  1. @* Write any password validation errors to the page *@ @Html.ValidationMessage("password")
  2. @* Write any password validation errors to the page *@ @Html.ValidationMessage("confirmPassword")
  3. To enable CAPTCHA verification, install the ASP.NET Web Helpers Library and uncomment ReCaptcha.GetHtml and replace 'PUBLIC_KEY' with your public key. At the top of this page, uncomment ReCaptcha. Validate and replace 'PRIVATE_KEY' with your private key.Register for reCAPTCHA keys at reCAPTCHA.net.

    @* @ReCaptcha.GetHtml("PUBLIC_KEY", theme: "white") @Html.ValidationMessage("recaptcha") *@

当您单击“注册”按钮时,您将再次看到“主页”,但是您现在将看到您通过提及电子邮件ID登录的信息。

商标

仅为会员创建页面

在该网站中,您需要一些只能由成员访问的页面。 ASP.NET允许您配置页面,以便只有登录成员才能访问它们。通常,如果匿名用户尝试访问仅会员页面,则可以将其重定向到登录页面

让我们看一个简单的示例,在其中修改About页面。当用户登录后,该用户可以访问该页面,否则该用户将被重定向到登录页面。因此,让我们在About.cshtml文件中替换以下代码。

@if (!WebSecurity.IsAuthenticated) {
   Response.Redirect("~/Account/Login");
}
@{
   Layout = "~/_SiteLayout.cshtml";
   Page.Title = "About My Site";
}

@Page.Title.

Your app description page.

Use this area to provide additional information.

Use this area to provide additional information.

Use this area to provide additional information.

让我们运行该应用程序,您将看到以下主页。

登录页面

到目前为止,该用户尚未登录,因此,当单击About链接时,您将看到您将定向到登录页面,如以下屏幕快照所示。

使用本地帐户

让我们输入凭据。

登录本地帐户

现在单击登录,您将看到主页。

现在,单击About链接时,您将看到About页面现在可以访问,如以下屏幕截图所示。

关于我的网站