如何使用IdentityServer4将AspNetIdentity添加到我的API中

时间:2018-06-26 09:48:45

标签: c# asp.net-core identityserver4

我正在构建.net核心应用程序,我有IdentityServer4和运行正常的MVC客户端。

在我的IdentityServer的启动中,我可以成功添加Asp.Net身份,并且可以访问本机UserManager和我的UserContext(扩展了IdentityDbContext)。

我还有一个API,我的MVC客户端(或其他客户端)可以调用该API以获得有关已登录用户的信息。该API成功地依赖于Identity Server,并且可以验证它接收到的access_token,提取sud,打开UserContext(在通用程序集中定义),找到用户并读取我添加到架构中的任何自定义表。不幸的是,我无法获取用于注册Asp.Net身份的API,因此无法利用UserManager查看角色和其他本机表。

这是IdentityServer启动:

public void ConfigureServices(IServiceCollection services)
{

    services.AddIdentity<ApplicationUser, ApplicationRole>()
    .AddEntityFrameworkStores<UserContext>()
    .AddDefaultTokenProviders();

    services.AddMvc();

    services.AddIdentityServer()
    .AddDeveloperSigningCredential()
    .AddAspNetIdentity<ApplicationUser>()
    .AddConfigurationStore(options =>
    {
        options.ConfigureDbContext = builder =>
        builder.UseSqlServer(IdentityConnectionString,
            sql => sql.MigrationsAssembly(migrationsAssembly));
    })
    .AddOperationalStore(options =>
    {
        options.ConfigureDbContext = builder =>
        builder.UseSqlServer(IdentityConnectionString,
            sql => sql.MigrationsAssembly(migrationsAssembly));
    });
}

使用此API的启动程序,可以成功处理请求:

public void ConfigureServices(IServiceCollection services)
{
    services.AddDbContext<UserContext>(options =>
    options.UseSqlServer(UserDbConnectionString));

    services.AddMvcCore()
    .AddAuthorization()
    .AddJsonFormatters();

    services
    .AddAuthentication("Bearer")
    .AddIdentityServerAuthentication(options =>
    {
        options.Authority = "http://localhost:5000";
        options.RequireHttpsMetadata = false;

        options.ApiName = "api1";
    });
}

GET请求的控制台输出(提供了令牌)如下

  

信息:Microsoft.AspNetCore.Hosting.Internal.WebHost [1]             请求启动HTTP / 1.1 GET http://localhost:5001/authorisation

     

信息:Microsoft.AspNetCore.Authentication.JwtBearer.JwtBearerHandler [2]             成功验证令牌。

     

信息:Microsoft.AspNetCore.Authentication.JwtBearer.JwtBearerHandler [8]             AuthenticationScheme:BearerIdentityServerAuthenticationJwt已成功认证。

     

信息:IdentityServer4.AccessTokenValidation.IdentityServerAuthenticationHandler [8]             AuthenticationScheme:承载已成功通过身份验证。

     

信息:Microsoft.AspNetCore.Authorization.DefaultAuthorizationService [1]             授权成功的用户:Joe Bloke。

如果我在这样的API启动中添加Asp.Net身份:

services.AddIdentity<ApplicationUser, ApplicationRole>()
.AddEntityFrameworkStores<UserContext>()
.AddDefaultTokenProviders();

然后查询失败,日志显示用户为“ null”。

  

信息:Microsoft.AspNetCore.Hosting.Internal.WebHost [1]             请求启动HTTP / 1.1 GET http://localhost:5001/authorisation

     

信息:Microsoft.AspNetCore.Authorization.DefaultAuthorizationService [2]             用户授权失败:(空)。

     

信息:Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker [3]             筛选器“ Microsoft.AspNetCore.Mvc.Authorization.AuthorizeFilter”的请求授权失败。

这将导致重定向到该API上不存在的登录页面,并因此返回404。 我尝试在API中添加对.AddAspNetIdentity()的调用,但是在AddIdentityServerAuthentication之后似乎无法识别

是否可以让API访问Asp.Net Identity UserManager? 我该怎么办才能解决此身份验证错误?

谢谢

1 个答案:

答案 0 :(得分:1)

尝试使用此代码

services.AddAuthentication(options =>
        {
            options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
            options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
        })