我正在构建.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? 我该怎么办才能解决此身份验证错误?
谢谢
答案 0 :(得分:1)
尝试使用此代码
services.AddAuthentication(options =>
{
options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
})