下面是关于“ASP.NET Core MVC之实现基于Token的认证”的完整攻略,包含两个示例说明。
简介
在ASP.NET Core MVC中,我们可以使用基于Token的认证来保护Web应用程序。基于Token的认证是一种无状态的认证方式,可以在客户端和服务器之间传递Token来验证用户身份。本攻略将介绍如何在ASP.NET Core MVC中实现基于Token的认证。
实现步骤
以下是在ASP.NET Core MVC中实现基于Token的认证的步骤:
- 添加NuGet包:
我们需要添加Microsoft.AspNetCore.Authentication.JwtBearer NuGet包来支持基于Token的认证。可以使用以下命令添加NuGet包:
dotnet add package Microsoft.AspNetCore.Authentication.JwtBearer
- 配置认证服务:
我们需要在Startup类的ConfigureServices方法中配置认证服务。例如,我们可以使用以下代码:
public void ConfigureServices(IServiceCollection services)
{
// ...
services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddJwtBearer(options =>
{
options.TokenValidationParameters = new TokenValidationParameters
{
ValidateIssuer = true,
ValidateAudience = true,
ValidateLifetime = true,
ValidateIssuerSigningKey = true,
ValidIssuer = "yourdomain.com",
ValidAudience = "yourdomain.com",
IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes("your_secret_key"))
};
});
// ...
}
在上面的代码中,我们使用AddAuthentication方法添加JwtBearer认证服务,并使用AddJwtBearer方法配置JwtBearer选项。在TokenValidationParameters中,我们设置了Issuer、Audience、Lifetime和IssuerSigningKey等参数。
- 配置认证中间件:
我们需要在Startup类的Configure方法中配置认证中间件。例如,我们可以使用以下代码:
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
// ...
app.UseAuthentication();
// ...
}
在上面的代码中,我们使用UseAuthentication方法将认证中间件添加到管道中。
- 生成Token:
我们需要在服务器端生成Token,并将Token发送给客户端。例如,我们可以使用以下代码:
[HttpPost]
public IActionResult Login([FromBody] LoginModel model)
{
if (model.Username == "admin" && model.Password == "password")
{
var claims = new[]
{
new Claim(ClaimTypes.Name, model.Username)
};
var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes("your_secret_key"));
var creds = new SigningCredentials(key, SecurityAlgorithms.HmacSha256);
var token = new JwtSecurityToken(
issuer: "yourdomain.com",
audience: "yourdomain.com",
claims: claims,
expires: DateTime.Now.AddMinutes(30),
signingCredentials: creds);
return Ok(new
{
token = new JwtSecurityTokenHandler().WriteToken(token)
});
}
return Unauthorized();
}
在上面的代码中,我们使用JwtSecurityToken类生成Token,并使用JwtSecurityTokenHandler类将Token转换为字符串。
- 验证Token:
我们需要在服务器端验证客户端发送的Token。例如,我们可以使用以下代码:
[Authorize]
[HttpGet]
public IActionResult Get()
{
var identity = HttpContext.User.Identity as ClaimsIdentity;
return Ok(new
{
username = identity.Name
});
}
在上面的代码中,我们使用Authorize特性来标记需要验证Token的Action方法,并使用HttpContext.User.Identity属性获取用户身份信息。
示例
示例1:生成Token并验证Token
在本示例中,我们将演示如何生成Token并验证Token。我们可以按照以下步骤来实现:
- 添加NuGet包:
我们需要添加Microsoft.AspNetCore.Authentication.JwtBearer NuGet包来支持基于Token的认证。可以使用以下命令添加NuGet包:
dotnet add package Microsoft.AspNetCore.Authentication.JwtBearer
- 配置认证服务:
我们需要在Startup类的ConfigureServices方法中配置认证服务。例如,我们可以使用以下代码:
public void ConfigureServices(IServiceCollection services)
{
// ...
services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddJwtBearer(options =>
{
options.TokenValidationParameters = new TokenValidationParameters
{
ValidateIssuer = true,
ValidateAudience = true,
ValidateLifetime = true,
ValidateIssuerSigningKey = true,
ValidIssuer = "yourdomain.com",
ValidAudience = "yourdomain.com",
IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes("your_secret_key"))
};
});
// ...
}
在上面的代码中,我们使用AddAuthentication方法添加JwtBearer认证服务,并使用AddJwtBearer方法配置JwtBearer选项。在TokenValidationParameters中,我们设置了Issuer、Audience、Lifetime和IssuerSigningKey等参数。
- 配置认证中间件:
我们需要在Startup类的Configure方法中配置认证中间件。例如,我们可以使用以下代码:
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
// ...
app.UseAuthentication();
// ...
}
在上面的代码中,我们使用UseAuthentication方法将认证中间件添加到管道中。
- 生成Token:
我们需要在服务器端生成Token,并将Token发送给客户端。例如,我们可以使用以下代码:
[HttpPost]
public IActionResult Login([FromBody] LoginModel model)
{
if (model.Username == "admin" && model.Password == "password")
{
var claims = new[]
{
new Claim(ClaimTypes.Name, model.Username)
};
var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes("your_secret_key"));
var creds = new SigningCredentials(key, SecurityAlgorithms.HmacSha256);
var token = new JwtSecurityToken(
issuer: "yourdomain.com",
audience: "yourdomain.com",
claims: claims,
expires: DateTime.Now.AddMinutes(30),
signingCredentials: creds);
return Ok(new
{
token = new JwtSecurityTokenHandler().WriteToken(token)
});
}
return Unauthorized();
}
在上面的代码中,我们使用JwtSecurityToken类生成Token,并使用JwtSecurityTokenHandler类将Token转换为字符串。
- 验证Token:
我们需要在服务器端验证客户端发送的Token。例如,我们可以使用以下代码:
[Authorize]
[HttpGet]
public IActionResult Get()
{
var identity = HttpContext.User.Identity as ClaimsIdentity;
return Ok(new
{
username = identity.Name
});
}
在上面的代码中,我们使用Authorize特性来标记需要验证Token的Action方法,并使用HttpContext.User.Identity属性获取用户身份信息。
示例2:使用Postman测试Token认证
在本示例中,我们将演示如何使用Postman测试Token认证。我们可以按照以下步骤来实现:
- 生成Token:
我们需要在服务器端生成Token,并将Token发送给客户端。例如,我们可以使用以下代码:
[HttpPost]
public IActionResult Login([FromBody] LoginModel model)
{
if (model.Username == "admin" && model.Password == "password")
{
var claims = new[]
{
new Claim(ClaimTypes.Name, model.Username)
};
var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes("your_secret_key"));
var creds = new SigningCredentials(key, SecurityAlgorithms.HmacSha256);
var token = new JwtSecurityToken(
issuer: "yourdomain.com",
audience: "yourdomain.com",
claims: claims,
expires: DateTime.Now.AddMinutes(30),
signingCredentials: creds);
return Ok(new
{
token = new JwtSecurityTokenHandler().WriteToken(token)
});
}
return Unauthorized();
}
在上面的代码中,我们使用JwtSecurityToken类生成Token,并使用JwtSecurityTokenHandler类将Token转换为字符串。
- 发送请求:
我们可以使用Postman发送请求,并在请求头中添加Authorization参数来发送Token。例如,我们可以使用以下请求:
```
GET /api/values HTTP/1.1
Host: localhost:5000
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJhZG1pbiIsImp0aSI6IjEwMjM0NTY3ODkiLCJuYmYiOjE2MzIwMjM1MzksImV4cCI6MTYzMjAyNzEzOSwiaWF0IjoxNjMyMDIzNTM5fQ.5JZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJ
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:asp.net core MVC之实现基于token的认证 - Python技术站