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

Posted

技术标签:

【中文标题】选择 webApi 模板时如何将 ASP.Net 身份添加到 Asp.Net Core?【英文标题】:How to add ASP.Net identity to Asp.Net Core when webApi template is selected? 【发布时间】:2017-08-30 15:41:51 【问题描述】:

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

【问题讨论】:

Identity 不太适合 Web API。改为查看 JwtBearer。 【参考方案1】:

编辑:

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

原答案

这会给你一个带有 aspnet 核心身份的熊骨头 webapi,首先创建你的项目(假设你已经创建了一个新文件夹并且你在其中):

dotnet new webapi

添加 aspnet 核心标识:

dotnet add package Microsoft.AspNetCore.Identity

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

dotnet add package Microsoft.EntityFrameworkCore.Sqlite

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

public class ApplicationUser : IdentityUser


还有一个 db 上下文,我在这里设置了类中的连接字符串,但您可能希望使用 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...

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

【讨论】:

很好的答案。现在我们如何在每次必须调用 API 上的后续方法时检查用户是否已登录?我们应该使用 signinmanager.IsSignedIn 方法吗? 很好的答案,但请记住,如果您遵循此答案并向服务添加带有 dbcontext 的选项,代码将会中断【参考方案2】:

模板没有什么特别之处,您只需要 Microsoft.AspNet.Identity.Core NuGet 包,您应该可以从这里开始:

https://docs.microsoft.com/en-us/aspnet/core/security/authentication/identity

【讨论】:

本文档解释了 Identity.Core 在您拥有 WebApp 而不是 WebApi 的情况下的使用 “WebApi”和“WebApp”之间没有区别了。文档是准确的。请参阅之前的答案。

以上是关于选择 webApi 模板时如何将 ASP.Net 身份添加到 Asp.Net Core?的主要内容,如果未能解决你的问题,请参考以下文章

asp.net 5 预览模板 - 网站

如何在 Asp.Net Core 3.0 WebAPI 中启用 CORS

如何将 Web API 控制器添加到现有的 ASP.NET Core MVC?

asp.net 如何变成 MVC 或 WebApi?

如何在asp.net核心中从客户端调用web api方法?

使用我们自己的 Nuget 包安装时,如何将 PostSharp 包含在 ASP.NET WebApi 项目的构建过程中?