无法访问客户端应用程序

时间:2019-01-20 16:25:59

标签: c# asp.net-core asp.net-core-mvc asp.net-identity asp.net-core-2.0

此应用程序将Identity 4与客户端mvc应用程序和IDP(身份提供程序)asp.net核心Web应用程序一起使用。

无法访问“控制器索引”操作视图。

如何解决此问题????

IDP项目启动项目(localhost:44393)

 public class Startup
    {
        // This method gets called by the runtime. Use this method to add services to the container.
        // For more information on how to configure your application, visit https://go.microsoft.com/fwlink/?LinkID=398940
        public void ConfigureServices(IServiceCollection services)
        {
            services.AddMvc();

            services.AddIdentityServer()
                  .AddDeveloperSigningCredential()
                  .AddTestUsers(Config.GetUsers())
                  .AddInMemoryIdentityResources(Config.GetIdentityResources())
                  .AddInMemoryClients(Config.GetClients());

        }

        // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
        public void Configure(IApplicationBuilder app, IHostingEnvironment env)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }

            app.UseIdentityServer();

            app.UseStaticFiles();

            app.UseMvcWithDefaultRoute();
            //app.Run(async (context) =>
            //{
            //    await context.Response.WriteAsync("Hello World!");
            //});
        }
    }

Configure.cs文件

 public static class Config
    {
        public static List<TestUser> GetUsers()
        {
            return new List<TestUser>
            {
                new TestUser
                {
                    SubjectId ="d866oef",
                    Username ="Kasunjith",
                    Password="password",
                    Claims= new List<Claim>
                    {
                        new Claim("given_name","Kasunjith"),
                        new Claim("family_name","Underwood"),
                    }
                }, new TestUser
                {
                    SubjectId ="d866omf",
                    Username ="BimalJith",
                    Password="password",
                    Claims= new List<Claim>
                    {
                        new Claim("given_name","BimalJith"),
                        new Claim("family_name","ViewWord"),
                    }
                },

            };

        }
        // identity-related resources (Scopes)
        public static IEnumerable<IdentityResource> GetIdentityResources()
        {
            return new List<IdentityResource>
            {
                new IdentityResources.OpenId(),
                new IdentityResources.Profile()
            };
        }

        public static IEnumerable<Client> GetClients()
        {
            return new List<Client>()
            {
                new Client
                {
                ClientName="Image Galary",
                ClientId="imagegalleryclient",
                AllowedGrantTypes = GrantTypes.Hybrid,
                RedirectUris = new List<string>()
                {
                    "https://localhost:44335/signin-oidc"
                },
                AllowedScopes =
                {
                        IdentityServerConstants.StandardScopes.OpenId
                },
                ClientSecrets =
                {
                    new Secret("secret".Sha256())
                }

                }
            };
        }

    }

客户端应用程序(localhost:44335)

public class Startup
    {
        public Startup(IConfiguration configuration)
        {
            Configuration = configuration;
        }

        public IConfiguration Configuration { get; }

        // This method gets called by the runtime. Use this method to add services to the container.
        public void ConfigureServices(IServiceCollection services)
        {
            services.AddMvc();

            services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();

            services.AddAuthentication(options =>
            {
                options.DefaultScheme = "Cookies";
                options.DefaultChallengeScheme = "oidc";
            }).AddCookie("Cookies",
           (options) =>
           {

           }).AddOpenIdConnect("oidc", options => {
               options.SignInScheme = "Cookies";
               options.Authority = "https://localhost:44393";
               options.ClientId = "imagegalleryclient";
               options.ResponseType = "code id_token";
               options.SaveTokens = true;
               options.ClientSecret = "secret";

           });


        }

        // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
        public void Configure(IApplicationBuilder app, IHostingEnvironment env)
        {
            if (env.IsDevelopment())
            {
                app.UseBrowserLink();
                app.UseDeveloperExceptionPage();
            }
            else
            {
                app.UseExceptionHandler("/Home/Error");
            }

            app.UseAuthentication();

            app.UseStaticFiles();

            app.UseMvc(routes =>
            {
                routes.MapRoute(
                    name: "default",
                    template: "{controller=Gallery}/{action=Index}/{id?}");
            });
        }
    }

我的控制器类

 [Authorize]
    public class GalleryController : Controller
    {
        public async Task<IActionResult> Index()
        {
            await WriteOutIdentityInformation();
            return View();
        }


        public async Task WriteOutIdentityInformation()
        {
            var identityToken = await HttpContext.GetTokenAsync(OpenIdConnectParameterNames.IdToken);


            Debug.WriteLine($"Identity token:{identityToken}");

            foreach (var claim in User.Claims)
            {
                Debug.WriteLine($"Claim type:{ claim.Type} -Claim value : {claim.Value}");
            }
        }
    }

使用用户名和密码登录后首先

enter image description here

转到localhost:44335 / Gallary / index后,显示此错误

enter image description here

1 个答案:

答案 0 :(得分:1)

对此不是100%肯定,但是我认为默认情况下,AddOpenIdConnect将请求OpenIdProfile范围,但是,您仅授予了客户OpenId范围,因此需要再添加一个。

            AllowedScopes =
            {
                    IdentityServerConstants.StandardScopes.OpenId,
                    IdentityServerConstants.StandardScopes.Profile
            },