ASP.NET Core认证和授权实例详解
ASP.NET Core是一个跨平台的开源Web框架,它提供了一套完整的认证和授权机制,可以帮助我们保护Web应用程序的安全性。下面是ASP.NET Core认证和授权的完整攻略:
认证
1. 添加认证服务
在ASP.NET Core应用程序中启用认证服务,需要在Startup.cs文件中的ConfigureServices方法中添加以下代码:
services.AddAuthentication(options =>
{
options.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme;
options.DefaultChallengeScheme = OpenIdConnectDefaults.AuthenticationScheme;
})
.AddCookie(options =>
{
options.LoginPath = "/Account/Login";
})
.AddOpenIdConnect(options =>
{
options.Authority = "https://localhost:5001";
options.ClientId = "client_id";
options.ClientSecret = "client_secret";
options.ResponseType = "code";
options.Scope.Add("openid");
options.Scope.Add("profile");
options.SaveTokens = true;
});
在上面的代码中,我们首先指定了默认的认证方案为CookieAuthenticationDefaults.AuthenticationScheme,指定了默认的挑战方案为OpenIdConnectDefaults.AuthenticationScheme。然后,我们添加了Cookie认证和OpenID Connect认证。在OpenID Connect认证中,我们指定了认证服务器的地址、客户端ID和客户端密钥,以及要请求的范围。
2. 添加认证中间件
在ASP.NET Core应用程序中启用认证中间件,需要在Startup.cs文件中的Configure方法中以下代码:
app.UseAuthentication();
在上面的代码中,我们使用了UseAuthentication方法来启用认证中间件。
3. 添加认证授权特性
在ASP.NET Core应用程序中使用认证授权特性,需要在Controller或Action中添加以下代码:
[Authorize]
public class HomeController : Controller
{
// ...
}
在上面的代码中,我们使用了Authorize特性来标记HomeController类,表示只有经过认证的用户才能访问该类的Action。
授权
1. 添加授权服务
在ASP.NET Core应用程序中启用授权服务,需要在Startup.cs文件中的ConfigureServices方法中添加以下代码:
services.AddAuthorization(options =>
{
options.AddPolicy("AdminOnly", policy => policy.RequireRole("Admin"));
});
在上面的代码中,我们添加了一个名为“AdminOnly”的授权策略,该策略要求用户必须具有“Admin”角色才能访问受保护的资源。
2. 添加授权中间件
在ASP.NET Core应用程序中启用授权中间件,需要在Startup.cs文件中的Configure方法中添加以下代码:
app.UseAuthorization();
在上面的代码中,我们使用了UseAuthorization方法来启用授权中间件。
3. 添加授权特性
ASP.NET Core应用程序中使用授权特性,需要在Controller或Action中添加以下代码:
[Authorize(Policy = "AdminOnly")]
public class AdminController : Controller
{
// ...
}
在上面的代码中,我们了Authorize特性来标记AdminController类,表示只有具有“Admin”角色的用户才能访问该类中的Action。
示例
示例1:使用JWT进行认证和授权
JWT(JSON Web Token)是一种轻量级的身份验证和授权机制,它可以在客户端和服务器之间传递安全的信息。下面是使用JWT进行认证和授权的示例:
- 添加JWT服务
在ASP.NET Core应用程序中启用JWT服务,需要在Startup.cs文件中的ConfigureServices方法中添加以下代码:
services.AddAuthentication(options =>
options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
})
.AddJwtBearer(options =>
{
options.RequireHttpsMetadata = false;
options.SaveToken = true;
options.TokenValidationParameters = new TokenValidationParameters
{
ValidateIssuerSigningKey = true,
IssuerSigningKey = new SymmetricSecurityKey(Encoding.ASCII.GetBytes(Configuration["Jwt:Key"])),
ValidateIssuer = false,
ValidateAudience = false
};
});
在上面的代码中,我们首先指定了默认的认证方案和挑战方案为JwtBearerDefaults.AuthenticationScheme。然后,我们添加了JwtBearer认证,并指定了JWT的验证参数。
- 添加JWT中间件
在ASP.NET Core应用程序中启用JWT中间件,需要在Startup.cs文件中的Configure方法中添加以下代码:
appAuthentication();
在上面的代码中,我们使用了UseAuthentication方法来启用JWT中间件。
- 添加JWT授权服务
在ASP.NET Core应用程序中启用JWT授权服务,需要在Startup.cs文件中的ConfigureServices方法中添加以下代码:
services.AddAuthorization(options =>
{
options.AddPolicy("AdminOnly", policy => policy.RequireClaim("role", "admin"));
});
在上面的代码中,我们添加了一个名“AdminOnly”的授权策略,该策略要求用户必须具有“admin”角色才能访问受保护的资源。
- 添加JWT授权中间件
在ASP.NET Core应用程序中启用JWT授权中间件,需要在Startup.cs文件中的Configure方法中添加以下代码:
app.UseAuthorization();
在上面的代码中,我们使用了UseAuthorization方法来启用JWT授权中间件。
- 生成JWT
在ASP.NET Core应用程序中生成JWT,需要使用以下代码:
var claims = new List<Claim>
{
new Claim(ClaimTypes.Name, "John Doe"),
new Claim(ClaimTypes.Role, "admin")
};
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);
在上面的代码中,我们首先创建了一个包含用户信息和角色信息的声明列表。然后,我们使用密钥和签名凭据创建了一个JWT。最后,我们JwtSecurityTokenHandler类将JWT转换为字符串。
- 验证JWT
在ASP.NET Core应用程序中验证JWT,需要使用以下代码:
services.AddAuthentication(options =>
{
options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
})
.AddJwtBearer(options =>
{
options.RequireHttpsMetadata = false;
options.SaveToken = true;
options.TokenValidationParameters = new TokenValidationParameters
{
ValidateIssuerSigningKey = true,
IssuerSigningKey = new SymmetricSecurityKey(Encoding.ASCII.GetBytes(Configuration["Jwt:Key"])),
ValidateIssuer = false,
ValidateAudience = false
};
});
在上面的代码中,我们使用了JwtBearer认证,并指定了JWT的验证参数。
示例2:使用Identity进行认证和授权
Identity是ASP.NET Core中的一个身份验证和授权框架,它提供了一套完整的用户管理和角色管理功能。下面是使用Identity进行认证和授权的示例:
- 添加Identity服务
在ASP.NET Core应用程序中启用Identity服务,需要在Startup.cs文件中的ConfigureServices方法中添加以下代码:
services.AddIdentity<IdentityUser, IdentityRole>()
.AddEntityFrameworkStores<ApplicationDbContext>()
.AddDefaultTokenProviders();
在上面的代码中,我们首先指定了IdentityUser和IdentityRole作为用户和角色实体类型。然后,我们添加了Entity Framework存储和默认令牌提供程序。
- 添加Identity中间件
在ASP.NET Core应用程序中启用Identity中间件,需要在Startup.cs文件中的Configure方法中添加以下代码:
app.UseAuthentication();
app.UseAuthorization();
在上面的代码中,我们使用了UseAuthentication和UseAuthorization方法来启用Identity中间件。
- 添加Identity授权服务
在ASP.NET Core应用程序中启用Identity授权服务,需要在Startup.cs文件中的ConfigureServices方法中添加以下代码:
services.AddAuthorization(options =>
{
options.AddPolicy("AdminOnly", policy => policy.RequireRole("Admin"));
});
在上面的代码中,我们添加了一个名为“AdminOnly”的授权策略,该策略要求用户必须具有“Admin”角色才能访问受保护的资源。
- 添加Identity授权中间件
在ASP.NET Core应用程序中启用Identity授权中间件,需要在Startup.cs文件中的Configure方法中添加以下代码:
app.UseAuthorization();
在上面的代码中,我们使用了UseAuthorization方法来启用Identity授权中间件。
- 注册用户
在ASP.NET Core应用程序中注册用户,需要使用以下代码:
var user = new IdentityUser { UserName = "john.doe@example.com", = "john.doe@example.com" };
var result = await _userManager.CreateAsync(user, "P@ssw0rd");
if (result.Succeeded)
{
await _userManager.AddToRoleAsync(user, "Admin");
}
在上面的代码中,我们首先创建了一个IdentityUser对象,然后使用UserManager类的CreateAsync方法将其添加到数据库中。最后,我们使用UserManager类的AddToRoleAsync方法将用户添加到“Admin”角色中。
- 登录用户
在ASP.NET Core应用程序中登录用户,需要使用以下代码:
var result = await _signInManager.PasswordSignInAsync(model.Email, model.Password, model.RememberMe, lockoutOnFailure: false);
if (result.Succeeded)
{
return RedirectToAction("Index", "Home");
}
else
{
ModelState.AddModelError(string.Empty, "Invalid login attempt.");
return View(model);
}
在上面的代码中,我们使用SignInManager类的PasswordSignInAsync方法来验证用户的凭据。如果验证成功,就重定向到主页。如果验证失败,就返回错误信息。
以上是ASP.NET Core认证和授权的完整攻略,我们可以根据实际需求选择不同的认证和授权机制来保护Web应用程序的安全性。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:asp.net core 认证和授权实例详解 - Python技术站