Asp.net web api 同一进程中的IdentityServer3和Web API

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

我在同一个项目中有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的代码:

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
声明的正确方法吗?