gpt4 book ai didi

c# - 选择 webApi 模板时如何将 ASP.Net 身份添加到 Asp.Net Core?

转载 作者:可可西里 更新时间:2023-11-01 08:02:53 25 4
gpt4 key购买 nike

我创建了一个 .NET Core 项目,其中选择了 WebApi 模板,不包括身份验证。我想在其中添加 ASP.NET 身份以进行基于角色的授权。我怎样才能做到这一点?

最佳答案

编辑:

这回答了问题,但总的来说我同意对上述问题的评论 - JWT 不记名 token 最适合 API,最好在为您的用例决定最佳方法之前了解该选项。

原始答案

这将为您提供一个具有 aspnet 核心身份的熊骨 webapi,首先创建您的项目(假设您已经创建了一个新文件夹并且您在其中):

dotnet new webapi

添加aspnet核心标识:

dotnet add package Microsoft.AspNetCore.Identity

添加一些数据库提供程序来存储您的数据:

dotnet add package Microsoft.EntityFrameworkCore.Sqlite

现在添加一个用户类型,最简单的版本是:

public class ApplicationUser : IdentityUser
{
}

还有一个数据库上下文,这里我在类中设置连接字符串,但您可能想改用 DbContextOptions:

public class IdentityContext : IdentityDbContext<ApplicationUser>
{
protected override void OnConfiguring
(DbContextOptionsBuilder optionsBuilder) =>
optionsBuilder.UseSqlite("your connection string");
}

然后在您的 Startup.cs 中添加以下标记行:

public Startup(IConfiguration configuration)
{
Configuration = configuration;

//add this: simply creates db if it doesn't exist, no migrations
using (var context = new IdentityContext())
{
context.Database.EnsureCreated();
}
}

public void ConfigureServices(IServiceCollection services)
{
//add this: register your db context
services.AddDbContext<IdentityContext>();

//and this: add identity and create the db
services.AddIdentity<ApplicationUser, IdentityRole>()
.AddEntityFrameworkStores<IdentityContext>();

services.AddMvc();
}

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
//add this
app.UseAuthentication();

app.UseMvc();
}

请注意,默认情况下,AddIdentity 扩展将设置默认身份验证方案并添加您可能不希望在 API 中使用的各种 cookie,缩减替代方案如下(以替换上述 ConfigureServices 中的 AddIdentity 调用):

services.AddIdentityCore<ApplicationUser>(options => { });
new IdentityBuilder(typeof(ApplicationUser), typeof(IdentityRole), services)
.AddRoleManager<RoleManager<IdentityRole>>()
.AddSignInManager<SignInManager<ApplicationUser>>()
.AddEntityFrameworkStores<IdentityContext>();

这将为您提供数据库方面的东西,然后您可以使用 UserManager 和 SignInManager 来创建和验证用户,让他们使用 DI 系统:

public class MyController : Controller
{
private UserManager<ApplicationUser> _userManager = null;
private SignInManager<ApplicationUser> _signInManager = null;

public MyController(
UserManager<ApplicationUser> userManager,
SignInManager<ApplicationUser> signInManager)
{
_userManager = userManager;
_signInManager = signInManager;
}

//etc...

然后使用如下:

var result = await _userManager.CreateAsync(
new ApplicationUser()
{
UserName = "bob",
Email = "bob@bob.com"
}, "Test123!");
if (result.Succeeded)
//do stuff...

和:

var user = await _userManager.FindByNameAsync("bob");
result = await _signInManager.CheckPasswordSignInAsync(user, "Test123!", false);
if (result.Succeeded)
//do stuff...

使用 CheckPasswordSignInAsync 而不是 PasswordSignInAsync 将避免创建 cookie 如果使用 AddIdentity,如果 AddIdentityCore上面也使用了,那么您必须使用 CheckPasswordSignInAsync,因为 PasswordSignInAsync 将不起作用,因为 IAuthenticationSignInHandler 将不会被设置。

关于c# - 选择 webApi 模板时如何将 ASP.Net 身份添加到 Asp.Net Core?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43224177/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com