IdentityServer4 是一個用于 ASP.NET Core 的 OpenID Connect 和 OAuth 2.0 框架,它可以幫助你實現身份驗證和授權功能。本文將介紹如何在 IdentityServer4 中入門,并演示如何為 API 添加客戶端憑據。
IdentityServer4 是一個開源的身份驗證和授權框架,它實現了 OpenID Connect 和 OAuth 2.0 協議。它可以幫助你構建安全的身份驗證和授權系統,允許客戶端應用程序(如 Web 應用、移動應用等)通過令牌(Token)來訪問受保護的資源。
OAuth 2.0 是一個授權框架,它允許第三方應用程序在用戶授權的情況下訪問用戶的資源。OAuth 2.0 主要用于授權,而不是身份驗證。
OpenID Connect 是建立在 OAuth 2.0 之上的身份驗證協議。它擴展了 OAuth 2.0,允許客戶端應用程序驗證用戶的身份,并獲取用戶的基本信息。
IdentityServer4 實現了這兩個協議,因此你可以使用它來構建一個完整的身份驗證和授權系統。
要開始使用 IdentityServer4,首先需要創建一個 ASP.NET Core 項目,并安裝 IdentityServer4 的 NuGet 包。
你可以使用 Visual Studio 或者 .NET CLI 來創建一個新的 ASP.NET Core 項目。
dotnet new webapi -n IdentityServerDemo
cd IdentityServerDemo
接下來,安裝 IdentityServer4 的 NuGet 包:
dotnet add package IdentityServer4
在安裝完 IdentityServer4 后,你需要在 Startup.cs 文件中配置 IdentityServer4。
在 Startup.cs 文件的 ConfigureServices 方法中,添加 IdentityServer4 的服務配置:
public void ConfigureServices(IServiceCollection services)
{
services.AddIdentityServer()
.AddDeveloperSigningCredential() // 用于開發環境的簽名憑據
.AddInMemoryApiResources(Config.GetApiResources()) // 添加 API 資源
.AddInMemoryClients(Config.GetClients()); // 添加客戶端
}
在上面的代碼中,我們使用了 Config.GetApiResources() 和 Config.GetClients() 方法來獲取 API 資源和客戶端配置。你可以在項目中創建一個 Config 類來定義這些配置。
public static class Config
{
public static IEnumerable<ApiResource> GetApiResources()
{
return new List<ApiResource>
{
new ApiResource("api1", "My API")
};
}
public static IEnumerable<Client> GetClients()
{
return new List<Client>
{
new Client
{
ClientId = "client",
AllowedGrantTypes = GrantTypes.ClientCredentials,
ClientSecrets =
{
new Secret("secret".Sha256())
},
AllowedScopes = { "api1" }
}
};
}
}
在這個配置中,我們定義了一個 API 資源 api1 和一個客戶端 client??蛻舳耸褂每蛻舳藨{據(Client Credentials)授權類型,并且只能訪問 api1 資源。
在 Startup.cs 文件的 Configure 方法中,添加 IdentityServer4 的中間件:
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
app.UseIdentityServer();
app.UseRouting();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
});
}
接下來,我們將創建一個受保護的 API,客戶端需要使用有效的令牌來訪問這個 API。
在項目中創建一個新的控制器 ValuesController:
[Route("api/[controller]")]
[ApiController]
public class ValuesController : ControllerBase
{
[HttpGet]
[Authorize]
public ActionResult<IEnumerable<string>> Get()
{
return new string[] { "value1", "value2" };
}
}
在這個控制器中,我們使用了 [Authorize] 屬性來保護 Get 方法。只有攜帶有效令牌的請求才能訪問這個方法。
在 Startup.cs 文件的 ConfigureServices 方法中,添加身份驗證服務:
public void ConfigureServices(IServiceCollection services)
{
services.AddAuthentication("Bearer")
.AddJwtBearer("Bearer", options =>
{
options.Authority = "https://localhost:5001"; // IdentityServer4 的地址
options.TokenValidationParameters = new TokenValidationParameters
{
ValidateAudience = false
};
});
services.AddAuthorization(options =>
{
options.AddPolicy("ApiScope", policy =>
{
policy.RequireAuthenticatedUser();
policy.RequireClaim("scope", "api1");
});
});
services.AddControllers();
}
在這個配置中,我們使用了 JWT Bearer 身份驗證方案,并指定了 IdentityServer4 的地址。我們還定義了一個名為 ApiScope 的授權策略,要求用戶必須經過身份驗證,并且擁有 api1 的 scope。
在 ValuesController 中,我們可以應用 ApiScope 授權策略:
[Route("api/[controller]")]
[ApiController]
[Authorize(Policy = "ApiScope")]
public class ValuesController : ControllerBase
{
[HttpGet]
public ActionResult<IEnumerable<string>> Get()
{
return new string[] { "value1", "value2" };
}
}
現在,我們已經完成了 IdentityServer4 和受保護 API 的配置。接下來,我們將測試客戶端憑據授權。
首先,我們需要使用客戶端憑據來獲取訪問令牌。你可以使用 Postman 或者任何 HTTP 客戶端來發送請求。
請求 URL: https://localhost:5001/connect/token
請求方法: POST
請求頭:
Content-Type: application/x-www-form-urlencoded
請求體:
grant_type=client_credentials
client_id=client
client_secret=secret
發送請求后,你將獲得一個訪問令牌:
{
"access_token": "eyJhbGciOiJSUzI1NiIsImtpZCI6Ij...",
"expires_in": 3600,
"token_type": "Bearer"
}
接下來,使用獲取到的訪問令牌來訪問受保護的 API。
請求 URL: https://localhost:5001/api/values
請求方法: GET
請求頭:
Authorization: Bearer eyJhbGciOiJSUzI1NiIsImtpZCI6Ij...
發送請求后,你將獲得 API 的響應:
[
"value1",
"value2"
]
在本文中,我們介紹了如何在 IdentityServer4 中入門,并演示了如何為 API 添加客戶端憑據。通過配置 IdentityServer4 和受保護的 API,你可以輕松地實現身份驗證和授權功能。希望本文對你有所幫助,祝你在使用 IdentityServer4 的過程中取得成功!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。