asp.net core 系列之用戶認證(1)-給項目添加 Identity

来源:https://www.cnblogs.com/Vincent-yuan/archive/2019/04/30/10793697.html
-Advertisement-
Play Games

對於沒有包含認證(authentication),的項目,你可以使用基架(scaffolder)把 Identity的程式集包加入到項目中,並且選擇性的添加Identity的代碼進行生成。 雖然基架已經生成了很多必須的代碼,但是你仍然需要更新你的項目來完善這個過程。 這篇文章主要就是解釋完善Iden ...


 

對於沒有包含認證(authentication),的項目,你可以使用基架(scaffolder)把 Identity的程式集包加入到項目中,並且選擇性的添加Identity的代碼進行生成。

 

雖然基架已經生成了很多必須的代碼,但是你仍然需要更新你的項目來完善這個過程。

這篇文章主要就是解釋完善Identity基架進行更新的一些步驟

 

當Identity基架添加以後,一個ScaffoldingReadme.txt 文件就被創建了,這裡面會包含一些完善Identity基架的說明。如下

ScaffoldingReadme.txt 


Support for ASP.NET Core Identity was added to your project 支持把ASP.NET Core Identity添加到你的項目里 - The code for adding Identity to your project was generated under Areas/Identity. 添加Identity生成的代碼在Areas/Identity下麵
關於Identity 相關的服務配置在Areas/Identity/IdentityHostingStartup.cs 中可以被找到 Configuration of the Identity related services can be found
in the Areas/Identity/IdentityHostingStartup.cs file. UI需要支持靜態文件,可以在Configure方法中調用 app.UseStaticFiles() The generated UI requires support for static files. To add static files to your app: 1. Call app.UseStaticFiles() from your Configure method
要使用ASP.NET Core Identity,你還需要允許認證(authentication),可以在Configure方法中調用 app.UseAuthentication(),在調用靜態文件之後做此設置 To use ASP.NET Core Identity you also need to enable authentication. To authentication to your app:
1. Call app.UseAuthentication() from your Configure method (after static files)
UI 要求MVC,可以通過在 Configure 方法中調用app.UseMvc(),在認證之後調用,
另外還需要在 ConfigureServices 中增加調用 services.AddMvc() The generated UI requires MVC. To add MVC to your app:
1. Call services.AddMvc() from your ConfigureServices method 2. Call app.UseMvc() from your Configure method (after authentication) Apps that use ASP.NET Core Identity should also use HTTPS. To enable HTTPS see https://go.microsoft.com/fwlink/?linkid=848054.

 

這篇文章會提供更詳細的說明

  • 把Identity基架添加到一個空項目
  • 把Identity基架添加到一個 不存在 認證(authentication)的  Razor項目(即項目中原來不存在認證的項目)
  • 把Identity基架添加到一個    存在  認證(authentication)的  Razor項目(即項目中原來存在認證的項目)
  • 把Identity基架添加到一個 不存在  認證(authentication)的 MVC項目(即項目中原來不存在認證的項目)
  • 把Identity基架添加到一個    存在   認證(authentication)的 MVC項目(即項目中原來存在認證的項目)
  • 創建一個完全的Identity UI (認證界面) 資源 

 

把Identity基架添加到一個空項目

1.首先,準備一個空項目

  • 文件->新建->項目
  • ASP.NET Core web應用,項目名EmptyForIdentity,確定
  • 選擇空項目

操作如圖:

 

 

2.添加Identity基架

  • 在項目上右鍵,添加->新搭建基架的項目
  • 標識->添加

 

 

 

然後,選擇文件;

 

 在這步,如果有佈局頁,可以選擇現有的佈局頁;

這裡沒有沒有佈局頁,也不需要指定一個新的佈局頁,就空著就可以了,它會自動生成一個新的佈局頁;

然後選擇你需要的功能頁面,這裡選擇的是登錄功能頁面,登錄功能頁面,註冊功能頁面;

再選擇數據上下文,這裡,如果存在的話,一樣可以選擇已經存在的;但是,在這個空項目中,是沒有數據上下文的,所以這裡直接點擊加號,

新增一個即可。

 

點擊添加

 

3.在StartUp文件類中,增加如下代碼:

public class Startup
    {
        // This method gets called by the runtime. Use this method to add services to the container.
        // For more information on how to configure your application, visit https://go.microsoft.com/fwlink/?LinkID=398940
        public void ConfigureServices(IServiceCollection services)
        {
       //新增的代碼 services.AddMvc(); }
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline. public void Configure(IApplicationBuilder app, IHostingEnvironment env) {
        //註釋的為空項目中原來的代碼
//if (env.IsDevelopment()) //{ // app.UseDeveloperExceptionPage(); //} //app.Run(async (context) => //{ // await context.Response.WriteAsync("Hello World!"); //}); if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); //引入異常中間件,捕獲之後出現的異常 } else { app.UseHsts(); //不是必須添加的,但推薦添加,之後會專門講解,待續 }
       //新增的代碼 app.UseHttpsRedirection(); app.UseStaticFiles(); app.UseAuthentication(); app.UseMvc(); } }

註意,如果StartUp按照原來空項目的代碼,去運行項目的話,像註冊,登錄,登出等功能頁面不能顯示,只列印 Hello world;

這裡從前面ScaffoldingReadme.txt 文件的說明也能看到,UI的顯示需要靜態文件和MVC等

 

4.遷移到資料庫

生成的Identity資料庫代碼需要用到Entity Framework Core Migrations(EFCore的遷移)來創建一個遷移,並更新到資料庫

如下:

Add-Migration CreateIdentitySchema
Update-Database

CreateIdentitySchema這個名字可以自己隨意取,但是最好能做到見名知義,知道做了哪些遷移

 

之後,可以自己打開vs上的sql server 對象資源管理器查看資料庫和表是否生成成功;

 

5.運行,查看效果

 

 

 

 這裡,要說下這個路徑了,為什麼會是上圖標示的這個路徑呢

下麵展示下目錄結構,如下圖:

即區域(Areas)下的 Identity/Account/Login 

這裡應該使用的是一種約定優先的路由方式,

這塊之後可能會給出一篇講解,這裡先知道怎麼找路由路徑即可

 

註意,下麵幾個與第一個類似,就不再給出詳細圖示,可以自己按步驟操作,如果有需要,後面再補充

把Identity基架添加到一個 不存在 認證(authentication)的  Razor項目

1.首先,準備一個項目中原來不帶認證的Razor項目

2.把Identity基架添加到項目中

  • 在項目上右鍵,添加->新搭建基架的項目
  • 標識->添加
  • 選擇功能文件(類似登錄,登出等),添加

這裡操作同第一個,可以按需選擇進行添加

3.遷移(Migrations),添加認證,佈局

遷移

Add-Migration CreateIdentitySchema
Update-Database

 

允許認證

在StartUp文件的Configure方法中,在靜態文件(UseStaticFiles)之後,調用 UseAuthentication 

public class Startup
{
    public Startup(IConfiguration configuration)
    {
        Configuration = configuration;
    }

    public IConfiguration Configuration { get; }

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddMvc();
    }

    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {
        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
        }
        else
        {
            app.UseExceptionHandler("/Error");
            app.UseHsts();
        }

        app.UseHttpsRedirection();
        app.UseStaticFiles();
        app.UseAuthentication(); //添加認證

        app.UseMvc();
    }
}

 

佈局變化

在佈局頁面(the layout file)中增加登錄分頁面(_LoginPartial)

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>@ViewData["Title"] - RazorNoAuth8</title>

    <environment include="Development">
        <link rel="stylesheet" href="~/lib/bootstrap/dist/css/bootstrap.css" />
        <link rel="stylesheet" href="~/css/site.css" />
    </environment>
    <environment exclude="Development">
        <link rel="stylesheet" href="https://ajax.aspnetcdn.com/ajax/bootstrap/3.3.7/css/bootstrap.min.css"
              asp-fallback-href="~/lib/bootstrap/dist/css/bootstrap.min.css"
              asp-fallback-test-class="sr-only" asp-fallback-test-property="position" asp-fallback-test-value="absolute" />
        <link rel="stylesheet" href="~/css/site.min.css" asp-append-version="true" />
    </environment>
</head>
<body>
    <nav class="navbar navbar-inverse navbar-fixed-top">
        <div class="container">
            <div class="navbar-header">
                <button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-collapse">
                    <span class="sr-only">Toggle navigation</span>
                    <span class="icon-bar"></span>
                    <span class="icon-bar"></span>
                    <span class="icon-bar"></span>
                </button>
                <a asp-page="/Index" class="navbar-brand">RazorNoAuth8</a>
            </div>
            <div class="navbar-collapse collapse">
                <ul class="nav navbar-nav">
                    <li><a asp-page="/Index">Home</a></li>
                    <li><a asp-page="/About">About</a></li>
                    <li><a asp-page="/Contact">Contact</a></li>
                </ul>
                <partial name="_LoginPartial" />
            </div>
        </div>
    </nav>

    <partial name="_CookieConsentPartial" />

    <div class="container body-content">
        @RenderBody()
        <hr />
        <footer>
            <p>&copy; 2018 - RazorNoAuth8</p>
        </footer>
    </div>

    <environment include="Development">
        <script src="~/lib/jquery/dist/jquery.js"></script>
        <script src="~/lib/bootstrap/dist/js/bootstrap.js"></script>
        <script src="~/js/site.js" asp-append-version="true"></script>
    </environment>
    <environment exclude="Development">
        <script src="https://ajax.aspnetcdn.com/ajax/jquery/jquery-3.3.1.min.js"
                asp-fallback-src="~/lib/jquery/dist/jquery.min.js"
                asp-fallback-test="window.jQuery"
                crossorigin="anonymous"
                integrity="sha384-K+ctZQ+LL8q6tP7I94W+qzQsfRV2a+AfHIi9k8z8l9ggpc8X+Ytst4yBo/hH+8Fk">
        </script>
        <script src="https://ajax.aspnetcdn.com/ajax/bootstrap/3.3.7/bootstrap.min.js"
                asp-fallback-src="~/lib/bootstrap/dist/js/bootstrap.min.js"
                asp-fallback-test="window.jQuery && window.jQuery.fn && window.jQuery.fn.modal"
                crossorigin="anonymous"
                integrity="sha384-Tc5IQib027qvyjSMfHjOMaLkfuWVxZxUPnCJA7l2mCWNIpG9mGCD8wGNIcPD7Txa">
        </script>
        <script src="~/js/site.min.js" asp-append-version="true"></script>
    </environment>

    @RenderSection("Scripts", required: false)
</body>
</html>

 

 

把Identity基架添加到一個    存在  認證(authentication)的  Razor項目

1.首先準備一個項目中原來存在認證的項目

2.把Identity基架添加到項目中

  • 在項目上右鍵,添加->新搭建基架的項目
  • 標識->添加
  • 選擇功能文件(類似登錄,登出等),添加

註意,這裡在選擇佈局這個頁面操作時,你可以選擇已經存在的佈局哦,還有資料庫上下文,也可以選擇使用已經存在的,當然也可以新建

 

 

把Identity基架添加到一個 不存在  認證(authentication)的 MVC項目

1.首先準備項目中原來不存在認證的MVC項目

2.把Identity基架添加到項目中

  • 在項目上右鍵,添加->新搭建基架的項目
  • 標識->添加
  • 選擇功能文件(類似登錄,登出等),添加

 

把登錄分頁(_LoginPartial)添加到Views/Shared/_Layout.cshtml 中

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>@ViewData["Title"] - MvcNoAuth3</title>

    <environment include="Development">
        <link rel="stylesheet" href="~/lib/bootstrap/dist/css/bootstrap.css" />
        <link rel="stylesheet" href="~/css/site.css" />
    </environment>
    <environment exclude="Development">
        <link rel="stylesheet" href="https://ajax.aspnetcdn.com/ajax/bootstrap/3.3.7/css/bootstrap.min.css"
              asp-fallback-href="~/lib/bootstrap/dist/css/bootstrap.min.css"
              asp-fallback-test-class="sr-only" asp-fallback-test-property="position" asp-fallback-test-value="absolute" />
        <link rel="stylesheet" href="~/css/site.min.css" asp-append-version="true" />
    </environment>
</head>
<body>
    <nav class="navbar navbar-inverse navbar-fixed-top">
        <div class="container">
            <div class="navbar-header">
                <button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-collapse">
                    <span class="sr-only">Toggle navigation</span>
                    <span class="icon-bar"></span>
                    <span class="icon-bar"></span>
                    <span class="icon-bar"></span>
                </button>
                <a asp-area="" asp-controller="Home" asp-action="Index" class="navbar-brand">MvcNoAuth3</a>
            </div>
            <div class="navbar-collapse collapse">
                <ul class="nav navbar-nav">
                    <li><a asp-area="" asp-controller="Home" asp-action="Index">Home</a></li>
                    <li><a asp-area="" asp-controller="Home" asp-action="About">About</a></li>
                    <li><a asp-area="" asp-controller="Home" asp-action="Contact">Contact</a></li>
                </ul>
                <partial name="_LoginPartial" />
            </div>
        </div>
    </nav>

    <partial name="_CookieConsentPartial" />

    <div class="container body-content">
        @RenderBody()
        <hr />
        <footer>
            <p>&copy; 2018 - MvcNoAuth3</p>
        </footer>
    </div>

    <environment include="Development">
        <script src="~/lib/jquery/dist/jquery.js"></script>
        <script src="~/lib/bootstrap/dist/js/bootstrap.js"></script>
        <script src="~/js/site.js" asp-append-version="true"></script>
    </environment>
    <environment exclude="Development">
        <script src="https://ajax.aspnetcdn.com/ajax/jquery/jquery-3.3.1.min.js"
                asp-fallback-src="~/lib/jquery/dist/jquery.min.js"
                asp-fallback-test="window.jQuery"
                crossorigin="anonymous"
                integrity="sha384-K+ctZQ+LL8q6tP7I94W+qzQsfRV2a+AfHIi9k8z8l9ggpc8X+Ytst4yBo/hH+8Fk">
        </script>
        <script src="https://ajax.aspnetcdn.com/ajax/bootstrap/3.3.7/bootstrap.min.js"
                asp-fallback-src="~/lib/bootstrap/dist/js/bootstrap.min.js"
                asp-fallback-test="window.jQuery && window.jQuery.fn && window.jQuery.fn.modal"
                crossorigin="anonymous"
                integrity="sha384-Tc5IQib027qvyjSMfHjOMaLkfuWVxZxUPnCJA7l2mCWNIpG9mGCD8wGNIcPD7Txa">
        </script>
        <script src="~/js/site.min.js" asp-append-version="true"></script>
    </environment>

    @RenderSection("Scripts", required: false)
</body>
</html>

 

然後,把 Pages/Shared/_LoginPartial.cshtml  移動到 Views/Shared/_LoginPartial.cshtml 位置

 

遷移

Add-Migration CreateIdentitySchema
Update-Database

 

添加認證

public class Startup
{

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddMvc();
    }

    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {
        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
        }
        else
        {
            app.UseExceptionHandler("/Home/Error");
            app.UseHsts();
        }

        app.UseHttpsRedirection();
        app.UseStaticFiles();
        app.UseAuthentication();
        app.UseMvcWithDefaultRoute(); //使用mvc預設路由
    }
}

 

把Identity基架添加到一個    存在   認證(authentication)的 MVC項目 

1.首先準備一個項目中原本存在認證(authentication)的MVC項目

2.把Identity基架添加到項目中

  • 在項目上右鍵,添加->新搭建基架的項目
  • 標識->添加
  • 選擇功能文件(類似登錄,登出等),添加

刪除  Pages/Shared  下的文件,和這個目錄

 

創建一個完全的Identity UI(認證界面)資源

下麵的代碼展示了對比預設Identity UI的一些變化,你可能會想對Identity UI更完全的控制。

public void ConfigureServices(IServiceCollection services)
{
    services.Configure<CookiePolicyOptions>(options =>
    {
        options.CheckConsentNeeded = context => true;
        options.MinimumSameSitePolicy = SameSiteMode.None;
    });

    services.AddDbContext<ApplicationDbContext>(options =>
        options.UseSqlServer(
            Configuration.GetConnectionString("DefaultConnection")));

    services.AddIdentity<IdentityUser, IdentityRole>()
        // services.AddDefaultIdentity<IdentityUser>()
        .AddEntityFrameworkStores<ApplicationDbContext>()
        .AddDefaultTokenProviders();

    services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1)
        .AddRazorPagesOptions(options =>
        {
            options.AllowAreas = true;
            options.Conventions.AuthorizeAreaFolder("Identity", "/Account/Manage");
            options.Conventions.AuthorizeAreaPage("Identity", "/Account/Logout");
        });

  //這裡設置了登錄路徑,登出路徑,沒許可權訪問的路徑 services.ConfigureApplicationCookie(options
=> { options.LoginPath = $"/Identity/Account/Login"; options.LogoutPath = $"/Identity/Account/Logout"; options.AccessDeniedPath = $"/Identity/Account/AccessDenied"; }); // using Microsoft.AspNetCore.Identity.UI.Services; 這裡註冊了一個IEmailSender郵件發送介面的實現 services.AddSingleton<IEmailSender, EmailSender>(); }

 

郵件實現的代碼:

public class EmailSender : IEmailSender
{
    public Task SendEmailAsync(string email, string subject, string message)
    {
        return Task.CompletedTask;
    }
}

 

結束!

參考文檔:

https://docs.microsoft.com/en-us/aspnet/core/security/authentication/scaffold-identity?view=aspnetcore-2.2&tabs=visual-studio#scaffold-identity-into-an-mvc-project-without-existing-authorization

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 本例使用的時python2.7環境,python3的操作應該也是差不多的。 需要用到smtplib和email兩個包。 發送文本類型的郵件 下麵看個發送文本郵件的例子(使用網易163的SMTP): 好像網易的SMTP有坑,message['From']和message['To']都要和sender和 ...
  • RabbitMQ的工作原理 它的基本結構 組成部分說明如下: Broker:消息隊列服務進程,此進程包括兩個部分:Exchange和Queue。 Exchange:消息隊列交換機,按一定的規則將消息路由轉發到某個隊列,對消息進行過慮。 Queue:消息隊列,存儲消息的隊列,消息到達隊列並轉發給指定的 ...
  • 今天就說一下自定義數組,至於要怎麼用,我也不知道,反正逼格挺高的。 閑話不多說,開始: 首先,自定義數組首先要創建一個類,用來做自定義數組的類型。 有了這個類後,我們就可以自定義一個User類型了。 當然,我們自定義的數組不僅可以存int類型,其他類型的也可以自定義的。 還有,其實,自定義類型的作用 ...
  • 1 import pandas as pd 2 import numpy as np 3 4 df = pd.DataFrame({ 5 'key1': [4, 5, 3, np.nan, 2], 6 'key2': [1, 2, np.nan, 4, 5], 7 'key3': [1, 2, 3,... ...
  • 1 日期時間類 在 Java 語言中,是通過時間戳來表示時間的。所謂的時間戳,在 Java 中就是指當前時間距離歷元(1970-01-01 00:00:00)的時間間隔,單位是毫秒,所以 Java 中時間的本質上是一個 long 類型的整數。 1.1 Date 類 Date 表示特定的瞬間,精確到毫 ...
  • 什麼叫做棧(Stack)呢?這裡的棧和jvm的java棧可不是一個東西。。。 棧作為一種數據結構,我感覺棧就類似一種介面,實現的話有很多種,比如用數組、集合、鏈表都可以實現棧的功能,棧最大的特點就是先進後出,可以想象一下放羽毛球的盒子怎麼放進羽毛球和拿出來羽毛球,我們把放進羽毛球的動作就叫做壓棧或者 ...
  • 1.url: 要求為String類型的參數,(預設為當前頁地址)發送請求的地址。 2.type: 要求為String類型的參數,請求方式(post或get)預設為get。註意其他http請求方法,例如put和delete也可以使用,但僅部分瀏覽器支持。 3.timeout: 要求為Number類型的 ...
  • 最近需要對老項目進行重構優化,由於項目都是好幾年前的,相關設計資料很不全,最基本的資料庫設計文檔都沒有,只能利用PowerDesigner逆向工程導出PDM模型及生成word文檔;以下簡單介紹導出模型操作步驟(以下演示操作是從SQL Server中導出) 第一步: 先打開 PowerDesigner ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...