手把手教你AspNetCore WebApi认证与授权的方法
在ASP.NET Core WebApi中,认证和授权是非常重要的安全措施。在本攻略中,我们将介绍如何在ASP.NET Core WebApi中实现认证和授权,并提供两个示例说明。
步骤一:添加认证和授权中间件
首先,需要在ASP.NET Core WebApi中添加认证和授权中间件。可以使用以下命令将Microsoft.AspNetCore.Authentication和Microsoft.AspNetCore.Authorization包添加到项目中:
dotnet add package Microsoft.AspNetCore.Authentication
dotnet add package Microsoft.AspNetCore.Authorization
在“Startup.cs”文件中,添加以下代码:
using Microsoft.AspNetCore.Authentication.JwtBearer;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.IdentityModel.Tokens;
using System.Text;
namespace MyWebApi
{
public class Startup
{
public void ConfigureServices(IServiceCollection services)
{
services.AddMvc();
services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddJwtBearer(options =>
{
options.TokenValidationParameters = new TokenValidationParameters
{
ValidateIssuer = true,
ValidateAudience = true,
ValidateLifetime = true,
ValidateIssuerSigningKey = true,
ValidIssuer = "mydomain.com",
ValidAudience = "mydomain.com",
IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes("mysecretkey"))
};
});
services.AddAuthorization(options =>
{
options.AddPolicy("MyPolicy", policy =>
{
policy.RequireAuthenticatedUser();
policy.RequireClaim("MyClaim");
});
});
}
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
app.UseAuthentication();
app.UseMvc();
}
}
}
在上面的代码中,我们使用了JWT Bearer认证方案,并添加了一个名为“MyPolicy”的授权策略。我们还配置了JWT令牌的验证参数,包括颁发者、受众、签名密钥等。
步骤二:添加认证和授权特性
接下来,需要在ASP.NET Core WebApi中添加认证和授权特性。可以使用以下代码在控制器或操作方法上添加特性:
[Authorize(Policy = "MyPolicy")]
public class MyController : Controller
{
[HttpGet]
public IActionResult MyAction()
{
return Ok();
}
}
在上面的代码中,我们使用了“Authorize”特性,并指定了“MyPolicy”授权策略。
示例一:使用JWT令牌认证和授权
以下是一个示例,演示如何使用JWT令牌认证和授权:
- 在命令行中,使用以下命令创建一个新的ASP.NET Core WebApi项目:
dotnet new webapi -n MyWebApi
- 在项目的根目录中,使用以下命令添加Microsoft.AspNetCore.Authentication和Microsoft.AspNetCore.Authorization包:
dotnet add package Microsoft.AspNetCore.Authentication
dotnet add package Microsoft.AspNetCore.Authorization
- 在“Startup.cs”文件中,添加以下代码:
using Microsoft.AspNetCore.Authentication.JwtBearer;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.IdentityModel.Tokens;
using System.Text;
namespace MyWebApi
{
public class Startup
{
public void ConfigureServices(IServiceCollection services)
{
services.AddMvc();
services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddJwtBearer(options =>
{
options.TokenValidationParameters = new TokenValidationParameters
{
ValidateIssuer = true,
ValidateAudience = true,
ValidateLifetime = true,
ValidateIssuerSigningKey = true,
ValidIssuer = "mydomain.com",
ValidAudience = "mydomain.com",
IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes("mysecretkey"))
};
});
services.AddAuthorization(options =>
{
options.AddPolicy("MyPolicy", policy =>
{
policy.RequireAuthenticatedUser();
policy.RequireClaim("MyClaim");
});
});
}
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
app.UseAuthentication();
app.UseMvc();
}
}
}
在上面的代码中,我们使用了JWT Bearer认证方案,并添加了一个名为“MyPolicy”的授权策略。我们还配置了JWT令牌的验证参数,包括颁发者、受众、签名密钥等。
- 在“Controllers”文件夹中,创建一个名为“MyController.cs”的文件,并添加以下代码:
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
namespace MyWebApi.Controllers
{
[Authorize(Policy = "MyPolicy")]
[Route("api/[controller]")]
public class MyController : Controller
{
[HttpGet]
public IActionResult MyAction()
{
return Ok();
}
}
}
在上面的代码中,我们使用了“Authorize”特性,并指定了“MyPolicy”授权策略。
- 在命令行中,使用以下命令运行应用程序:
dotnet run
- 在浏览器中,导航到“http://localhost:5000/api/my”。
-
应该看到401未经授权的错误。
-
在命令行中,使用以下命令生成JWT令牌:
dotnet add package System.IdentityModel.Tokens.Jwt
using System;
using System.IdentityModel.Tokens.Jwt;
using System.Security.Claims;
using System.Text;
using Microsoft.IdentityModel.Tokens;
namespace MyWebApi
{
public class JwtTokenGenerator
{
public static string GenerateToken()
{
var tokenHandler = new JwtSecurityTokenHandler();
var key = Encoding.ASCII.GetBytes("mysecretkey");
var tokenDescriptor = new SecurityTokenDescriptor
{
Subject = new ClaimsIdentity(new Claim[]
{
new Claim(ClaimTypes.Name, "myusername"),
new Claim("MyClaim", "myvalue")
}),
Expires = DateTime.UtcNow.AddMinutes(5),
SigningCredentials = new SigningCredentials(new SymmetricSecurityKey(key), SecurityAlgorithms.HmacSha256Signature)
};
var token = tokenHandler.CreateToken(tokenDescriptor);
return tokenHandler.WriteToken(token);
}
}
}
在上面的代码中,我们使用了JWT令牌生成器类,生成了一个包含用户名和自定义声明的JWT令牌。
- 在命令行中,使用以下命令获取JWT令牌:
dotnet run MyWebApi.dll
curl -X POST -H "Content-Type: application/json" -d '{"username":"myusername","password":"mypassword"}' http://localhost:5000/api/token
在上面的命令中,我们使用了curl命令向“/api/token”端点发送POST请求,以获取JWT令牌。
- 在命令行中,使用以下命令向“/api/my”端点发送GET请求,并在请求头中添加JWT令牌:
curl -H "Authorization: Bearer <jwt_token>" http://localhost:5000/api/my
在上面的命令中,我们使用了curl命令向“/api/my”端点发送GET请求,并在请求头中添加JWT令牌。
- 应该看到200成功的响应。
示例二:使用基本身份验证认证和授权
以下是一个示例,演示如何使用基本身份验证认证和授权:
- 在命令行中,使用以下命令创建一个新的ASP.NET Core WebApi项目:
dotnet new webapi -n MyWebApi
- 在“Startup.cs”文件中,添加以下代码:
using Microsoft.AspNetCore.Authentication;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.DependencyInjection;
using System.Security.Claims;
using System.Text;
using System.Threading.Tasks;
namespace MyWebApi
{
public class Startup
{
public void ConfigureServices(IServiceCollection services)
{
services.AddMvc();
services.AddAuthentication("BasicAuthentication")
.AddScheme<AuthenticationSchemeOptions, BasicAuthenticationHandler>("BasicAuthentication", null);
services.AddAuthorization(options =>
{
options.AddPolicy("MyPolicy", policy =>
{
policy.RequireAuthenticatedUser();
policy.RequireClaim("MyClaim");
});
});
}
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
app.UseAuthentication();
app.UseMvc();
}
}
public class BasicAuthenticationHandler : AuthenticationHandler<AuthenticationSchemeOptions>
{
protected override async Task<AuthenticateResult> HandleAuthenticateAsync()
{
if (!Request.Headers.ContainsKey("Authorization"))
return AuthenticateResult.Fail("Missing Authorization Header");
string username = "", password = "";
var authHeader = AuthenticationHeaderValue.Parse(Request.Headers["Authorization"]);
var credentialBytes = Convert.FromBase64String(authHeader.Parameter);
var credentials = Encoding.UTF8.GetString(credentialBytes).Split(':');
username = credentials[0];
password = credentials[1];
if (username != "myusername" || password != "mypassword")
return AuthenticateResult.Fail("Invalid Username or Password");
var claims = new[] { new Claim(ClaimTypes.Name, username) };
var identity = new ClaimsIdentity(claims, Scheme.Name);
var principal = new ClaimsPrincipal(identity);
var ticket = new AuthenticationTicket(principal, Scheme.Name);
return AuthenticateResult.Success(ticket);
}
}
}
在上面的代码中,我们使用了基本身份验证认证方案,并添加了一个名为“MyPolicy”的授权策略。我们还实现了一个名为“BasicAuthenticationHandler”的自定义身份验证处理程序,用于验证用户名和密码。
- 在“Controllers”文件夹中,创建一个名为“MyController.cs”的文件,并添加以下代码:
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
namespace MyWebApi.Controllers
{
[Authorize(Policy = "MyPolicy")]
[Route("api/[controller]")]
public class MyController : Controller
{
[HttpGet]
public IActionResult MyAction()
{
return Ok();
}
}
}
在上面的代码中,我们使用了“Authorize”特性,并指定了“MyPolicy”授权策略。
- 在命令行中,使用以下命令运行应用程序:
dotnet run
- 在命令行中,使用以下命令向“/api/my”端点发送GET请求,并在请求头中添加基本身份验证凭据:
curl -H "Authorization: Basic <base64_encoded_username_and_password>" http://localhost:5000/api/my
在上面的命令中,我们使用了curl命令向“/api/my”端点发送GET请求,并在请求头中添加基本身份验证凭据。
- 应该看到200成功的响应。
结论
在本攻略中,我们介绍了如何在ASP.NET Core WebApi中实现认证和授权,并提供了两个示例说明。我们使用了JWT令牌认证和授权以及基本身份验证认证和授权。通过使用认证和授权,我们可以确保WebApi在传输数据时具有更高的安全性。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:手把手教你AspNetCore WebApi认证与授权的方法 - Python技术站