# ASP.NET(Web Form)教學平台
僑光科技大學 資訊科技系
2021/02/22 ~ 2021/6/25
授課老師:高吉隆
電子信箱:[kevinkao888@gmail.com](mailto://kevinkao888@gmail.com)
###### tags: `課程大綱`
----
## 課程說明
* 專題製作注意事項
* 課程前之準備
* ASP.NET之介紹
* Web Form之概念
* Web Form之實作
* 參考資料
----
## 專題製作注意事項
* 教師收集研讀重點至共筆平台
* 請專題生自行研讀,並提出問題
* 操作時請把步驟截圖,貼至此平台
* 必需登入才能編輯
* 並且在平台註記貼文者
---
## 課程前之準備
* 若電腦等級較慢請安裝較低版本
* 安裝 Visual Studio 軟體
* VS Community 2019:[下載](https://visualstudio.microsoft.com/zh-hant/vs/older-downloads/)
* 安裝 SQL Server 軟體
* SQL Server Express:[2016](https://www.microsoft.com/zh-TW/download/details.aspx?id=56840)
* SQL Server Management Studio 18:[下載](https://docs.microsoft.com/zh-tw/sql/ssms/download-sql-server-management-studio-ssms?view=sql-server-ver15)
----
### 安裝 Visual Studio Community 2019 #1
* 安裝前安裝設定
![](https://i.imgur.com/K2nc5FC.png)
----
### 安裝 Visual Studio Community 2019 #2
![](https://i.imgur.com/S7BVKri.png)
----
### 安裝 Visual Studio Community 2019 #3
* 選擇傳統型與行動裝置:.NET桌面開發,再按安裝
![](https://i.imgur.com/OYV0zzy.png)
----
### 安裝 Visual Studio Community 2019 #4
![](https://i.imgur.com/oWVUyzy.png)
----
### 安裝 Visual Studio Community 2019 #5
![](https://i.imgur.com/TOqFrXH.png)
----
### 安裝 Visual Studio Community 2019 #6
* 選擇暫不登入
![](https://i.imgur.com/FlQgX2Z.png)
----
### 安裝 Visual Studio Community 2019 #7
* 啟動 Visual Studio
![](https://i.imgur.com/XB7UFdP.png)
----
### 安裝 Visual Studio Community 2019 #8
* 建立新的專案
![](https://i.imgur.com/lf3JGwp.png)
----
### 安裝 Visual Studio Community 2019 #9
* 選擇Windows Form應用程式(C#/Windows/桌面)
![](https://i.imgur.com/q1Xc8Iy.png)
----
### 安裝 Visual Studio Community 2019 #10
* 選擇目標Framework .NET 5.0
![](https://i.imgur.com/kHk3jl8.png)
---
### 安裝 SQL Server Express 2016 #1
* 選擇安裝類型:基本
![](https://i.imgur.com/ujyNIqS.png =800x500)
----
### 安裝 SQL Server Express 2016 #2
* 選擇:接受授權條款
![](https://i.imgur.com/UW3UGtf.png =800x500)
----
### 安裝 SQL Server Express 2016 #3
* 選擇:安裝
![](https://i.imgur.com/5UbwvD4.png =800x500)
----
### 安裝 SQL Server Express 2016 #4
* 下載安裝封裝
![](https://i.imgur.com/meb5K47.png =800x500)
----
### 安裝 SQL Server Express 2016 #5
* 正在安裝
![](https://i.imgur.com/jNguolO.png =800x500)
----
### 安裝 SQL Server Express 2016 #6
* 結束安裝
![](https://i.imgur.com/hKe2qwB.png =800x500)
----
### 安裝 SQL Server Management Studio 18 #1
* 選擇位置後按安裝
![](https://i.imgur.com/zdfhEq1.png)
----
### 安裝 SQL Server Management Studio 18 #2
* 安裝進度
![](https://i.imgur.com/n1TS1CT.png)
----
### 安裝 SQL Server Management Studio 18 #3
* 結束安裝
![](https://i.imgur.com/MPM6FHh.png)
---
## ASP.NET之介紹
* Visual C#
* Windows Desktop
* Web
* ASP.NET Core Web應用程式
* ASP.NET Web應用程式(.Net Framework)
* 空白:建立空白網頁
* Web Form:建立Aspx網頁
* MVC:建立以MVC架構開發網頁
* Web API:建立以API為主的網頁
---
## Web Form之實作-會員功能
* Demo1-建立內建有會員功能的網頁
* 會員以EMail為帳號
* 密碼預設需含大小寫字母及1個符號
* Demo2-增加會員的欄位
* 以增加使用者名稱欄位為例
* Demo3-使用Google帳號登入
* Demo4-使用Facebook帳號登入
* Demo5-運用GMAIL寄發認證信
* Demo6-啟用忘記密碼和重發認證信
* Demo7-查看資料庫內容
---
### Demo1-建立內建有會員功能的網頁
* 使用ASP.NET.Identity元件建立
![](https://i.imgur.com/BmqX7kE.png)
----
#### Demo1-Step1-建立新專案
* 開啟 Visual Studio Community 2017
* 選擇新增專案如下:
![](https://i.imgur.com/cd670d7.png)
----
#### Demo1-Step2-選擇專案類型:ASP.NET Web
* 選擇C#中的Web,並選ASP.Net Web應用程式
* 輸入專案名稱Demo1,選擇專案路徑,並按確定
![](https://i.imgur.com/uIwMuj6.png)
----
#### Demo1-Step3-選擇開發方式:Web Form
* 選擇種類:Web Form
![](https://i.imgur.com/wjQHvMa.png)
----
#### Demo1-Step4-選擇驗證方式:個別使用者帳戶
* 若驗證方式為無驗證,請改為個別使用者帳戶
* 再按確定,並等待建立專案
![](https://i.imgur.com/8QH02ba.png)
----
#### Demo1-Step5-建立完成請確認檔案
* 專案視窗中有多個資料夾
* 建立好的專案畫面如下:
![](https://i.imgur.com/QrDrVHR.png)
----
#### Demo1-Step6-執行結果(電腦版)
* 按播放鍵開始執行
* 瀏覽器畫面如下(電腦版):
![](https://i.imgur.com/qtNmxPG.png)
----
#### Demo1-Step7-執行結果(手機版)
* 瀏覽器畫面如下(手機版):
![](https://i.imgur.com/6w2zmLP.png)
---
### Demo2-增加會員的欄位
![](https://i.imgur.com/UNgbHbm.png)
----
#### Demo2-Step1-建立測試帳號
* 註冊1個測試帳號
![](https://i.imgur.com/Ue0jeF3.png)
----
#### Demo2-Step2-檢查資料庫內容
* {檢視}=>{伺服器總管}
![](https://i.imgur.com/gzvepwT.png)
----
#### Demo2-Step3-會員資料表的說明
* AspNetUsers:儲存使用者資訊
* AspNetRoles:設定使用者的權限
* AspNetUserClaims:儲存使用者授權的狀態
* AspNetUserLogins:儲存OAuth登入的資訊
* AspNetUserRoles:儲存使用者群組資訊
* 以下為AspNetUsers的紀錄
![](https://i.imgur.com/Gj72rSa.png)
----
#### Demo2-Step4-加入新增欄位之定義
* 開啟Models資料夾中的IdentityModels.cs
* 在ApplicationUser類別中加入UserTitle
```csharp=
public string UserTitle { get; set; }
```
![](https://i.imgur.com/Ld2KFqm.png)
----
#### Demo2-Step5-在註冊頁中加入輸入欄位1
* 開啟Account資料夾中的Register.aspx
* 輸入以下程式:
```htmlembedded=
<div class="form-group">
<asp:Label runat="server" AssociatedControlID="UserTitle" CssClass="col-md-2 control-label">使用者名稱</asp:Label>
<div class="col-md-10">
<asp:TextBox runat="server" ID="UserTitle" CssClass="form-control" />
<asp:RequiredFieldValidator runat="server" ControlToValidate="UserTitle"
CssClass="text-danger" ErrorMessage="必須填寫使用者名稱欄位。" />
</div>
</div>
```
----
#### Demo2-Step6-在註冊頁中加入輸入欄位2
* 開啟Account資料夾中的Register.aspx.cs
* 修改以下程式:
```javascript=
var user = new ApplicationUser() {
UserName = Email.Text,
Email = Email.Text,
UserTitle = UserTitle.Text
};
```
----
#### Demo2-Step7-以主控台建立欄位
* {工具}{NuGet封裝管理員}{套件管理器主控台}
* 開啟資料移轉功能:Enable-Migrations
* 建立移轉程式:Add-Migration "newfields"
* 刪除多餘的程式指令
* 更新資料庫:Update-Database
```
PM> Enable-Migrations
Code First 移轉已為專案 720VIP 啟用。
PM> Add-Migration "newfields"
正在為移轉 'newfields' 建立結構。
這個移轉檔案的設計工具程式碼包括目前 Code First 模型的快照。這個快照是用於為下一個移轉建立結構時計算模型的變更。如果您對模型進行其他變更,而且想將變更包含在這個移轉中,只要再次執行 'Add-Migration newfields' 就能重新建立結構。
PM> Update-Database
指定 '-Verbose' 旗標,可檢視要套用至目標資料庫的 SQL 陳述式。
正在套用明確移轉: [202102031537475_newfields]。
正在套用明確移轉: 202102031537475_newfields。
正在執行 Seed 方法。
```
----
#### Demo2-Step8-重新執行註冊網頁
![](https://i.imgur.com/OnNHJR1.png)
----
#### Demo2-Step9-確認欄位及資料是否建立
![](https://i.imgur.com/XsmmpWW.png)
---
### Demo3-使用Google帳號登入
![](https://i.imgur.com/VHS48ff.png)
----
#### Demo3-Step1-更新NuGet套件
* 工具>NuGet封裝管理員>管理方案NuGet套件
* 搜尋條件:OWIN,全選後按更新
![](https://i.imgur.com/Woungfw.png)
----
#### Demo3-Step2-修改瀏覽方式為SSL
* 開啟專案的屬性視窗
* 將SSL已啟用改為:True
* 開啟專案屬性的視窗,選擇Web
* 輸入專案URL為:https://localhost:44300/
* 重新執行網頁,確認網頁已修改完成
![](https://i.imgur.com/MmDT0U4.png =550x350)
----
#### Demo3-Step3-設定Google API
* 進入GCP控制台:[連結](https://console.developers.google.com/)
* API服務>OAuth同意畫面:填寫應用程式資訊
* 選擇使用者類型:外部、填寫EMail、上傳Logo
![](https://i.imgur.com/OCwt3KG.png)
----
#### Demo3-Step4-建立憑證1
* 選擇類型:OAuth用戶端ID
* 選擇應用程式類型:網頁應用程式
* 已授權的 JavaScript 來源
* 輸入:https://localhost:44300
* 已授權的重新導向 URI
* 輸入:https://localhost:44300/signin-google
* 取得用戶端編號及密碼
* 用戶端編號:000-xoxo.apps.googleusercontent.com
* 用戶端密碼:oxoxoxoxoxoxoxoxo
----
#### Demo3-Step4-建立憑證2
![](https://i.imgur.com/NeqKHVm.png =800x600)
----
#### Demo3-Step5-輸入用戶端編號及密碼
* 開啟App_Start資料夾中的Startup.Auth.cs
* 註解掉以下幾行,並輸入(請替換成自已的)
* 用戶端編號:000-xoxo.apps.googleusercontent.com
* 用戶端密碼:oxoxoxoxoxoxoxoxo
```csharp=
app.UseGoogleAuthentication(new GoogleOAuth2AuthenticationOptions() {
ClientId = "000-xoxo.apps.googleusercontent.com",
ClientSecret = "oxoxoxoxoxoxoxoxo"
});
```
----
#### Demo3-Step6-重新執行登入頁面
* 出現Google登入選項,點選Google登入
* 出現Google登入帳號和密碼畫面
* 登入正常會出現輸入登入之信箱
* 若未重覆,則會正常登入
![](https://i.imgur.com/DZ0oYb7.png)
----
#### Demo3-Step7-確認資料表新增紀錄
* 請確認以下2個資料表
* AspNetUsers:
* AspNetUserLogins:
![](https://i.imgur.com/m9BiLtF.png)
![](https://i.imgur.com/R55JjRI.png)
---
### Demo4-使用Facebook帳號登入
![](https://i.imgur.com/VHS48ff.png)
----
#### Demo4-Step1-建立Facebook應用程式
* 進入Facebook開發者平台:[連結](https://developers.facebook.com/apps/)
* 建立應用程式選擇類別:打造互聯體驗
![](https://i.imgur.com/F7rm6kI.png)
----
#### Demo4-Step2-輸入應用程式資訊
|輸入應用程式名稱及信箱|確定非機器人操作|
|:-:|:-:|
|![](https://i.imgur.com/CoDUtdC.png)|![](https://i.imgur.com/B8OIHQn.png)|
----
#### Demo4-Step3-設定Facebook登入
* 選擇Facebook登入
* 選擇應用程式平台:網站
* 填寫電子信箱、上傳Logo
* 輸入有效的Oauth重新導向URI
```htmlembedded
https://localhost:44300/signin-facebook
```
![](https://i.imgur.com/CLIByCL.png)
----
#### Demo4-Step4-取得應用程式編號及密鑰
* 應用程式編號:000000000000
* 應用程式密錀:oxoxoxoxoxox
![](https://i.imgur.com/T1BvENb.png)
----
#### Demo4-Step5-輸入應用程式編號及密鑰
* 開啟App_Start資料夾中的Startup.Auth.cs
* 註解掉以下幾行,並輸入(請替換成自已的)
* 應用程式編號:000000000000
* 應用程式密錀:oxoxoxoxoxox
```csharp=
app.UseFacebookAuthentication(
appId: "000000000000",
appSecret: "oxoxoxoxoxox");
```
---
### Demo5-運用GMAIL寄發認證信
* 系統預設為註冊後立即可登入使用
* 改為註冊後透過寄發認證信,才能登入
![](https://i.imgur.com/tslIfOu.png)
----
#### Demo5-Step1-產生及使用應用程式密碼
* 打開Google帳號:[連結](https://myaccount.google.com/)
* 安全性->兩步驟驗證:開啟
* 安全性->應用程式密碼:1組密碼
![](https://i.imgur.com/9MRfpqm.png)
----
#### Demo5-Step2-設定應用程式密碼
* 選取應用程式:郵件
* 選取裝置:Windows電腦
* 產生:並記下密碼
![](https://i.imgur.com/cvChRI0.png)
----
#### Demo5-Step3-修改網站設定檔
* 打開根目錄中的Web.config
* 於configuration區段加入以下程式
* 修改Google E-Mail帳號
* 修改應用程式密碼
```xml=
<appSettings>
<add key="emailServiceUserName" value="username@gmail.com" />
</appSettings>
<system.net>
<mailSettings>
<smtp from="username@gmail.com" deliveryMethod="Network">
<network host="smtp.gmail.com" password="1234567890123456" port="587" userName="username@gmail.com" enableSsl="true" />
</smtp>
</mailSettings>
</system.net>
```
----
#### Demo5-Step4-修改寄信程式
* 打開App_Start中的IdentityConfig.cs
* 修改SendAsync函數
* 新增configSendGridasync函數
```csharp=
public async Task SendAsync(IdentityMessage message)
{
await configSendGridasync(message);
// return Task.FromResult(0);
}
private async Task configSendGridasync(IdentityMessage message) {
MailMessage mailMessage = new MailMessage(ConfigurationManager.AppSettings["emailServiceUserName"], message.Destination);
mailMessage.Subject = message.Subject;
mailMessage.IsBodyHtml = true;
mailMessage.Body = message.Body;
SmtpClient client = new SmtpClient();
client.SendCompleted += (s, e) => {
client.Dispose();
};
await client.SendMailAsync(mailMessage);
}
```
----
#### Demo5-Step5-修改註冊網頁
* 打開Account中的Register.aspx.cs
* 修改CreateUser_Click函數
```csharp=
if (result.Succeeded) {
string code = manager.GenerateEmailConfirmationToken(user.Id);
string callbackUrl = IdentityHelper.GetUserConfirmationRedirectUrl(code, user.Id, Request);
manager.SendEmail(user.Id, "確認您的帳戶", "請按一下此連結確認您的帳戶 <a href=\"" + callbackUrl + "\">這裏</a>.");
if (user.EmailConfirmed) {
signInManager.SignIn(user, isPersistent: false, rememberBrowser: false);
IdentityHelper.RedirectToReturnUrl(Request.QueryString["ReturnUrl"], Response);
} else {
ErrorMessage.Text = "信件已經寄至你的信箱。請收信而且確認你的帳號並完成註冊程序。";
}
} else {
ErrorMessage.Text = result.Errors.FirstOrDefault();
}
```
* 若需修改主旨、認證信內容,請於此修改
----
#### Demo5-Step6-修改登入後的判斷
* 打開Account中的Login.aspx.cs
* 修改Login函數
```csharp=
if (IsValid) {
var manager = Context.GetOwinContext().GetUserManager<ApplicationUserManager>();
var signinManager = Context.GetOwinContext().GetUserManager<ApplicationSignInManager>();
var user = manager.FindByName(Email.Text);
if (user != null) {
if (!user.EmailConfirmed) {
FailureText.Text = "無效的登入嘗試。你必需有一個已驗證過信箱的帳號。";
ErrorMessage.Visible = true;
// 若需重送確認信,可以手動顯示
// ResendConfirm.Visible = true;
} else {
var result = signinManager.PasswordSignIn(Email.Text, Password.Text, RememberMe.Checked, shouldLockout: false);
switch (result) {
// 其中幾行不變
}
}
}
}
```
----
#### Demo5-Step7-測試是否收到認證信
* 重新測試註冊一個新帳號
* 註冊完請確認無法可立即登入
* 必需收到認證信,點擊認證網址才能登入
* 該帳戶之EmailConfirmed欄位值:1
|收到認證信|認證成功|
|-|-|
|![](https://i.imgur.com/rAYgNYJ.png)|![](https://i.imgur.com/a1lPNeJ.png)|
---
### Demo6-忘記密碼發送重設密碼信件
* 忘記密碼:可重新寄發重設密碼網址
|1.登入時出現按鈕|2.忘記密碼畫面|
|---|---|
|![](https://i.imgur.com/Y4Y6O56.png)|![](https://i.imgur.com/uhJaxjx.png)|
----
#### Demo6-Step1-修改網頁程式
* 打開Account中的Forgot.aspx.cs
* 修改Forgot函數:取消3行註解
```csharp=
string code = manager.GeneratePasswordResetToken(user.Id);
string callbackUrl = IdentityHelper.GetResetPasswordRedirectUrl(code, Request);
manager.SendEmail(user.Id, "重設密碼", "請按 <a href=\"" + callbackUrl + "\">這裏</a> 重設密碼.");
```
----
#### Demo6-Step2-修改網頁版面和程式
* 打開Account中的Login.aspx
* 修改HyperLink元件:取消1行註解
```htmlmixed=
<%-- 一旦您的帳戶確認啟用了密碼重設功能請加以啟用 --%>
<asp:HyperLink runat="server" ID="ForgotPasswordHyperLink" ViewStateMode="Disabled">忘記密碼?</asp:HyperLink>
```
* 打開Account中的Login.aspx.cs
* 修改Form_Load函數:取消1行註解
```csharp=
// 一旦您啟用了帳戶確認以使用密碼重設功能,則會啟動此項目
ForgotPasswordHyperLink.NavigateUrl = "Forgot";
```
----
#### Demo6-Step3-寄發重設密碼郵件
* 打開Account中的Login.aspx.cs
* 新增SendEmailConfirmationToken函數
```csharp=
protected void SendEmailConfirmationToken(object sender, EventArgs e) {
var manager = Context.GetOwinContext().GetUserManager<ApplicationUserManager>();
var user = manager.FindByName(Email.Text);
if (user != null) {
if (!user.EmailConfirmed) {
string code = manager.GenerateEmailConfirmationToken(user.Id);
string callbackUrl = IdentityHelper.GetUserConfirmationRedirectUrl(code, user.Id, Request);
manager.SendEmail(user.Id, "確認您的帳戶", "請按一下此連結確認您的帳戶 <a href=\"" + callbackUrl + "\">這裏</a>.");
FailureText.Text = "信件已經寄至你的信箱。請收信而且確認你的帳號並完成註冊程序。";
ErrorMessage.Visible = true;
ResendConfirm.Visible = false;
}
}
}
```
----
#### Demo6-Step4-顯示重送確認信按鈕
* 打開Account中的Login.aspx.cs
* 修改Login函數:取消1行註解
```csharp=
// 若需重送確認信,可以手動顯示
ResendConfirm.Visible = true;
```
----
#### Demo6-Step5-測試重設密碼信件
* 打開Account中的Login.aspx
* 新增Button元件
```htmlmixed=
<div class="form-group">
<div class="col-md-offset-2 col-md-10">
<asp:Button runat="server" OnClick="LogIn" Text="登入" CssClass="btn btn-default" />
<asp:Button runat="server" ID="ResendConfirm" OnClick="SendEmailConfirmationToken" Text="重送驗證信" Visible="false" CssClass="btn btn-default" />
</div>
</div>
```
|1.重設密碼信件之回應|2.寄出重設密碼信件|
|-|-|
|![](https://i.imgur.com/nbR7OUy.png)|![](https://i.imgur.com/eumElPl.png =300x150)
---
### Demo7-查看資料庫內容
----
#### Demo7-Step1-將資料庫檔案加入專案
|1.顯示所有檔案|2.選擇檔案加入至專案|
|-|-
|![](https://i.imgur.com/N8qUJ2C.png)|![](https://i.imgur.com/O7dS0vO.png =500x400)
----
#### Demo7-Step2-將資料庫檔案加入專案
* 點選資料庫檔案並開啟,並於資料庫總管中顯示
![](https://i.imgur.com/YE3P1uw.png)
---
## 參考資料
* ASP.NET官方教學網站:[連結](https://docs.microsoft.com/zh-tw/aspnet/overview)
* W3Schools網站:[連結](https://www.w3schools.com/asp/default.asp)
* MIS2000:[連結](https://www.youtube.com/c/%E5%85%A9%E5%8D%83MIS/playlists)
* Youtube:[連結](https://youtu.be/OMr_Z7Ops90)
* AboutSSL:[連結](https://aboutssl.org/cheap-ssl-certificate-providers/)
* Facebook Login:[連結](https://developers.facebook.com/docs/facebook-login/)
{"metaMigratedAt":"2023-06-15T19:14:26.281Z","metaMigratedFrom":"Content","title":"ASP.NET(Web Form)教學平台","breaks":true,"contributors":"[{\"id\":\"9eed60a5-6546-4dfd-8445-07f81bcfde52\",\"add\":16872,\"del\":3314}]"}