Asp.net web api 同一进程中的IdentityServer3和Web API
我在同一个项目中有Asp.net MVC web应用程序和webapi。我正在使用资源所有者凭据流进行身份管理。是否可以在同一个startup.cs(webapplication的startup.cs)中配置webapi、客户端和身份服务器。尝试在同一startup.cs中配置webapi和identity server时,我遇到了以下错误“IdentityServer3.AccessTokenValidation.dll中出现了“System.InvalidOperationException”类型的异常,但未在用户代码中处理 其他信息:IDX10803:无法创建以从“”获取配置。“ 以下是my startup.cs的代码:Asp.net web api 同一进程中的IdentityServer3和Web API,asp.net-web-api,identityserver3,Asp.net Web Api,Identityserver3,我在同一个项目中有Asp.net MVC web应用程序和webapi。我正在使用资源所有者凭据流进行身份管理。是否可以在同一个startup.cs(webapplication的startup.cs)中配置webapi、客户端和身份服务器。尝试在同一startup.cs中配置webapi和identity server时,我遇到了以下错误“IdentityServer3.AccessTokenValidation.dll中出现了“System.InvalidOperationException
using IdentityServer3.AccessTokenValidation;
using IdentityServer3.Core.Configuration;
using IdentityServer3.Core.Services;
using IdentityServer3.Core.Services.Default;
using MarilynIdentityServer.IdentityServer;
using Microsoft.Owin;
using Owin;
using System;
//using System.IdentityModel.Claims;
using System.Security.Claims;
using System.Security.Cryptography.X509Certificates;
using System.Threading.Tasks;
using System.Web.Http;
using System.Linq;
[assembly: OwinStartupAttribute(typeof(MarilynIdentityServer.Startup))]
namespace MarilynIdentityServer
{
public class Startup
{
public void Configuration(IAppBuilder app)
{
var factory = new IdentityServerServiceFactory()
.UseInMemoryClients(Clients.Get())
.UseInMemoryScopes(Scopes.Get());
var userService = new UserLoginService();
factory.UserService = new Registration<IUserService>(resolver => userService);
factory.CorsPolicyService = new Registration<ICorsPolicyService>(new DefaultCorsPolicyService { AllowAll = true });
var option = new IdentityServerOptions
{
SiteName = "Embedded IdentityServer",
SigningCertificate = LoadCertificate(),
Factory = factory,
//AuthenticationOptions = new AuthenticationOptions
//{
// //EnableLocalLogin = false,
// IdentityProviders = ConfigureIdentityProviders
//},
};
app.UseIdentityServer(option);
app.Map("/api", idsrvApi =>
{
// token validation
idsrvApi.UseIdentityServerBearerTokenAuthentication(new IdentityServerBearerTokenAuthenticationOptions
{
Authority = "https://localhost:44303/",
RequiredScopes = new[] { "sampleApi" }
});
// add app local claims per request
idsrvApi.UseClaimsTransformation(incoming =>
{
// either add claims to incoming, or create new principal
var appPrincipal = new ClaimsPrincipal(incoming);
incoming.Identities.First().AddClaim(new Claim("appSpecific", "some_value"));
return Task.FromResult(appPrincipal);
});
// web api configuration
var config = new HttpConfiguration();
config.MapHttpAttributeRoutes();
idsrvApi.UseWebApi(config);
});
}
X509Certificate2 LoadCertificate()
{
return new X509Certificate2(
string.Format(@"{0}bin\identityServer\idsrv3test.pfx", AppDomain.CurrentDomain.BaseDirectory), "idsrv3test");
}
}
}
使用IdentityServer3.AccessTokenValidation;
使用IdentityServer3.Core.Configuration;
使用IdentityServer3.Core.Services;
使用IdentityServer3.Core.Services.Default;
使用MarilyIdentityServer.IdentityServer;
使用Microsoft.Owin;
使用Owin;
使用制度;
//使用System.IdentityModel.Claims;
使用System.Security.Claims;
使用System.Security.Cryptography.X509证书;
使用System.Threading.Tasks;
使用System.Web.Http;
使用System.Linq;
[程序集:OwinStartupAttribute(typeof(MarilynIdentityServer.Startup))]
名称空间MarilyIdentityServer
{
公营创业
{
公共无效配置(IAppBuilder应用程序)
{
var factory=new IdentityServerServiceFactory()
.UseInMemoryClients(Clients.Get())
.UseInMemoryScopes(Scopes.Get());
var userService=new UserLoginService();
factory.UserService=新注册(解析器=>UserService);
factory.CorsPolicyService=新注册(新的DefaultCorsPolicyService{AllowAll=true});
var option=新标识服务器选项
{
SiteName=“嵌入式IdentityServer”,
SigningCertificate=LoadCertificate(),
工厂,
//AuthenticationOptions=新的AuthenticationOptions
//{
////EnableLocalLogin=false,
//IdentityProviders=配置IdentityProviders
//},
};
app.UseIdentityServer(可选);
app.Map(“/api”,idsrvApi=>
{
//令牌验证
idsrvApi.UseIdentityServerBearTokenauthentication(新的IdentityServerBearTokenauthentication选项
{
权威=”https://localhost:44303/",
RequiredScopes=new[]{“sampleApi”}
});
//每个请求添加应用程序本地声明
idsrvApi.UseClaimTransformation(传入=>
{
//将索赔添加到传入索赔,或创建新的主体索赔
var appPrincipal=新的ClaimsPrincipal(传入);
incoming.identies.First().AddClaim(新声明(“appSpecific”、“some_值”);
返回Task.FromResult(appPrincipal);
});
//web api配置
var config=新的HttpConfiguration();
config.maphttpAttribute路由();
idsrvApi.UseWebApi(配置);
});
}
X509Certificate2加载证书()
{
返回新的X509Certificate2(
string.Format(@“{0}bin\identityServer\idsrv3test.pfx”、AppDomain.CurrentDomain.BaseDirectory)、“idsrv3test”);
}
}
}
总之,是否可以在同一个应用程序中配置WebApi、Webapplication和Identity Server
任何帮助都将不胜感激
问候
Amit这肯定是可能的,但是我也遇到过类似的问题,无法找到本地身份服务器 通常解决方法是修改管道,使Identity Server位于其自己的
app.Map
块中,而不是根目录中。这似乎使身份验证中间件能够发现它
如果您尝试这样做,请不要忘记更新身份验证中间件中的权限。我使用的是’s和Andras Nemes’s的组合,两者都非常优秀,从而实现了这个问题所述的目标。下面是对我有用的Startup.cs:
using IdentityServer3.Core.Configuration;
using Owin;
using System.Web.Http;
namespace idsvr3owin
{
public class Startup
{
public void Configuration(IAppBuilder app)
{
// kick the Web API piece of this app
app.Map(
"/api",
apiApp => {
HttpConfiguration httpConfiguration = new HttpConfiguration();
// api.App_Start is a namespace in my app
api.App_Start.WebApiConfig.Register(httpConfiguration);
apiApp.UseWebApi(httpConfiguration);
}
);
// kick the IdentityServer3 piece of this app
app.Map(
"/identity",
identityApp =>
{
identityApp.UseIdentityServer(new IdentityServerOptions
{
SiteName = "Standalone Identity Server",
// idsvr3 is a namespace in my app
SigningCertificate = idsvr3.Cert.LoadCertificate(),
Factory = new IdentityServerServiceFactory()
.UseInMemoryClients(idsvr3.Clients.Get())
.UseInMemoryScopes(idsvr3.Scopes.Get())
.UseInMemoryUsers(idsvr3.Users.Get()),
RequireSsl = true
});
}
);
}
}
}
在Amit的代码中,(1)我建议删除CORS代码,因为不需要CORS,因为API和IdentityServer都在同一台服务器上运行。(2) 我建议对声明转换代码进行注释,因为追踪异常源不需要该代码。最后,(3)我建议注意确保app.Map(“/api”…与config.maphttpAttribute()不冲突,因为这两者都在为Web API代码设置路由中发挥作用。通常,我建议使用一种比此处尝试的Amit更简单的启动方法。是否可以使用
UseIdentityServerAuthentication
,然后使用UseClaimTransformation
?因为我已经尝试过了,并且该方法作为U的参数提供seClaimsTransformation
方法未被调用,也未使用提供的声明成功进行身份验证,这是将aspnetcore的IdentityUser
字段移植到JwtClaimTypes
声明的正确方法吗?