iT邦幫忙

2024 iThome 鐵人賽

DAY 13
0
Modern Web

ASP.NET Core的終極奧義:從零到無敵系列 第 13

Day_13 建立安全的身份驗證與授權機制

  • 分享至 

  • xImage
  •  

在當今的數位時代,網路安全問題變得越來越重要。當我們開發API時,安全性是無法忽視的一環。透過有效的身份驗證與授權機制,我們可以保護API,確保只有合法用戶才能存取敏感數據。ASP.NET Core為開發者提供了強大的身份驗證與授權功能,使其能夠簡便地實作這些安全措施。本篇文章將介紹如何在ASP.NET Core API中實作身份驗證與授權功能。

1. 理解身份驗證與授權
在開始之前,了解身份驗證與授權的區別是很重要的。身份驗證是確認用戶身份的過程,例如通過用戶名和密碼登錄。而授權則是決定已驗證的用戶是否有權訪問特定資源的過程。只有當用戶通過身份驗證後,授權機制才能進一步確保用戶能夠執行其有權進行的操作。

2. 安裝所需的NuGet包
在ASP.NET Core中,我們可以使用JWT(JSON Web Tokens)來實現身份驗證,這是一種輕量級的身份驗證方法。首先,在我們的ASP.NET Core項目中,使用NuGet安裝以下包:

dotnet add package Microsoft.AspNetCore.Authentication.JwtBearer

這個包將幫助我們實作JWT的身份驗證。

3. 配置服務
在Startup.cs文件中,我們需要配置ASP.NET Core為JWT身份驗證服務。首先,在ConfigureServices方法中,添加身份驗證服務並設置JWT的配置:

public void ConfigureServices(IServiceCollection services)
{
    services.AddAuthentication(options =>
    {
        options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
        options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
    })
    .AddJwtBearer(options =>
    {
        options.TokenValidationParameters = new TokenValidationParameters
        {
            ValidateIssuer = true,
            ValidateAudience = true,
            ValidateLifetime = true,
            ValidateIssuerSigningKey = true,
            ValidIssuer = Configuration["Jwt:Issuer"],
            ValidAudience = Configuration["Jwt:Audience"],
            IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(Configuration["Jwt:Key"]))
        };
    });

    services.AddControllers();
}

這裡我們配置了一些重要的參數,比如發行者(Issuer)、觀眾(Audience)、秘鑰(Key)。這些參數可以在appsettings.json中定義:

{
  "Jwt": {
    "Key": "這是一個非常安全的密鑰",
    "Issuer": "YourIssuer",
    "Audience": "YourAudience"
  }
}

4. 生成JWT令牌
現在,我們需要創建一個方法來生成JWT令牌。以下是一段生成JWT令牌的示範程式碼:

public string GenerateJwtToken(string userName)
{
    var claims = new[]
    {
        new Claim(JwtRegisteredClaimNames.Sub, userName),
        new Claim(JwtRegisteredClaimNames.Jti, Guid.NewGuid().ToString())
    };

    var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(Configuration["Jwt:Key"]));
    var creds = new SigningCredentials(key, SecurityAlgorithms.HmacSha256);

    var token = new JwtSecurityToken(
        issuer: Configuration["Jwt:Issuer"],
        audience: Configuration["Jwt:Audience"],
        claims: claims,
        expires: DateTime.Now.AddMinutes(30),
        signingCredentials: creds);

    return new JwtSecurityTokenHandler().WriteToken(token);
}

5. 使用身份驗證與授權
在控制器中,我們可以使用[Authorize]屬性來保護特定的API端點。這樣只有已驗證的用戶才能訪問這些端點。例如:

[Authorize]
[ApiController]
[Route("[controller]")]
public class WeatherForecastController : ControllerBase
{
    [HttpGet]
    public IEnumerable<WeatherForecast> Get()
    {
        return new List<WeatherForecast>
        {
            new WeatherForecast { Date = DateTime.Now, TemperatureC = 25, Summary = "Sunny" }
        };
    }
}

6. 測試API
在測試API之前,您需要先獲得一個JWT令牌。您可以通過一個登入端點來生成這個令牌,並在調用受保護的端點時將它放在請求標頭中。

使用基於Postman或其他API測試工具,您可以將生成的JWT令牌添加到請求的Authorization標頭中,格式為:

Authorization: Bearer {Token}

7. 常見問題與最佳實踐
定期更新秘鑰:確保定期更新JWT秘鑰以增強安全性。
設置到期時間:JWT應設置合理的到期時間,避免長時間使用同一令牌。
使用HTTPS:確保所有API通過HTTPS提供服務,以便加密傳輸中的數據。
使用刷新令牌:考慮實作刷新令牌來管理用戶的會話。
結語
在ASP.NET Core中實作身份驗證與授權機制是保護您的API不受未經授權訪問的重要步驟。通過以上步驟,我們能夠成功設置JWT身份驗證,並確保只有合格的用戶能夠訪問敏感數據。在開發過程中,始終記住安全性是重中之重,並遵循最佳實踐來維護API的安全性。希望本篇文章對您有所幫助!


上一篇
Day_12 使用Swagger進行API文檔生成
下一篇
Day_14 整合第三方服務與API
系列文
ASP.NET Core的終極奧義:從零到無敵30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言