代码之家  ›  专栏  ›  技术社区  ›  General Electric

用于用户管理的Identity Server和web api

  •  7
  • General Electric  · 技术社区  · 8 年前

    我正在为我的项目使用Identity Server3,我目前有一个网站和api受Id服务器保护,但工作正常,因为我将用户存储在Id服务器数据库中,我无法真正更改网站中的任何用户数据,例如更改个人资料图片或任何索赔值。

    为了解决这个问题,我正在考虑在IdServer上创建一个API,这个API将管理用户、更改密码、检索用户或更改与用户相关的任何内容。我想在示例项目上创建这个API,其中我的IdServer使用Owin映射。

    现在,我的idServer位于/identity路由中,如下所示

    public class Startup
    {
        public void Configuration(IAppBuilder app)
        {
    
            Log.Logger = new LoggerConfiguration().MinimumLevel.Debug().WriteTo.Trace().CreateLogger();            
    
            app.Map("/identity", idserverApp =>
             {
                 var efConfig = new EntityFrameworkServiceOptions
                 {
                     ConnectionString = "IdSvr3Config"
                 };
    
                 var options = new IdentityServerOptions
                 {
                     SiteName = "Identity server",
                     IssuerUri = ConfigurationManager.AppSettings["idserver:stsIssuerUri"],
                     PublicOrigin = ConfigurationManager.AppSettings["idserver:stsOrigen"],
                     SigningCertificate = Certificate.Get(),
                     Factory = Factory.Configure(efConfig),
                     AuthenticationOptions = AuthOptions.Configure(app),
                     CspOptions = new CspOptions { Enabled = false },
                     EnableWelcomePage=false
                 };
    
    
                 new TokenCleanup(efConfig, 3600 * 6).Start();
                 idserverApp.UseIdentityServer(options);
             });
    
            app.UseIdServerApi();
    
        }        
    }
    

    我的api“中间件”如下

    **public static class IdServerApiExtensions
        {
            public static void UseIdServerApi(this IAppBuilder app, IdServerApiOptions options = null)
            {
                if (options == null)
                    options = new IdServerApiOptions();            
    
                if (options.RequireAuthentication)
                {
                    var dic = app.Properties;
                    JwtSecurityTokenHandler.InboundClaimTypeMap = new Dictionary<string, string>();
                    app.UseIdentityServerBearerTokenAuthentication(
                        new IdentityServerBearerTokenAuthenticationOptions
                        {
                            Authority = "https://localhost:44302/identity", //here is the problem, it says not found even though I already mapped idServer to /identity
                            RequiredScopes = new[]
                            {
                            "idserver-api"
                            },
                            ValidationMode=ValidationMode.ValidationEndpoint
                        });
                }
                var config = new HttpConfiguration();
                WebApiConfig.Register(config,options.RequireAuthentication);
                app.UseNinjectMiddleware(() => NinjectConfig.CreateKernel.Value);
                app.UseNinjectWebApi(config);
                app.Use<IdServerApiMiddleware>(options);
            }
        }**
    

    我知道这是可能的,我只是不知道在同一个项目上使用这个api是否是一个好主意,而且我也不知道怎么做。

    • 创建这个API来管理用户是个好主意吗?如果没有,我可以用什么?
    • 如何创建适当的设置以在/API下启动API,同时使用IdServer保护此API?

    使现代化

    正在添加 ,解决了我的问题,感谢Scott Brady

    谢谢

    1 回复  |  直到 8 年前
        1
  •  9
  •   Scott Brady    8 年前

    Identity Server团队的一般建议是将任何管理页面或API作为单独的项目运行( Most recent example ). 最佳做法是只允许您的Identity Server和身份管理应用程序访问您的身份数据库/商店。

    要管理用户,可以编写自己的API。其他选择是将其包含在单个MVC网站中,或使用类似 Identity Manager .

    但是,您仍然可以使用相同的应用程序方法,使用OWIN映射。为了确保安全,您可以使用 IdentityServer3.AccessTokenValidation 包,使用以下代码:

    app.UseIdentityServerBearerTokenAuthentication(new IdentityServerBearerTokenAuthenticationOptions
    {
        Authority = ConfigurationManager.AppSettings["idserver:stsOrigen"],
        RequiredScopes = new[] { "adminApi" },
        ValidationMode = ValidationMode.ValidationEndpoint
    });