Identityserver4:MVC客户端应用程序中基于角色的安全性

时间:2017-11-11 10:25:41

标签: c# oauth-2.0 .net-core identityserver4 asp.net-core-2.0

我已按照此GIT repo中的说明设置了Identityserver4,API资源和MVC客户端应用程序。 我正在用dot net core 2.0 framework测试这个应用程序。

  • IdentityServerWithAspIdAndEF - > Identityserver4设置哪个 负责验证特定用户。
  • Api - >示例API资源
  • MvcClient - >服务器端MVC客户端应用程序。

我还需要在MvcClient应用程序中实现基于角色的授权,因此我需要声明有关MvcClient应用程序中的角色。我已经尝试通过引用此stackoverflow post来实现IProfileService。但它没有用。

IdentityServerWithAspIdAndEF配置

services.AddDbContext<ApplicationDbContext>(options =>
            options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));

        services.AddIdentity<ApplicationUser, IdentityRole>()
            .AddEntityFrameworkStores<ApplicationDbContext>()
            .AddDefaultTokenProviders();

        // Add application services.
        services.AddTransient<IEmailSender, EmailSender>();

        services.AddMvc();

        string connectionString = Configuration.GetConnectionString("DefaultConnection");
        var migrationsAssembly = typeof(Startup).GetTypeInfo().Assembly.GetName().Name;

        // configure identity server with in-memory stores, keys, clients and scopes
        services.AddIdentityServer()
            .AddDeveloperSigningCredential()
            .AddAspNetIdentity<ApplicationUser>()
            // this adds the config data from DB (clients, resources)
            .AddConfigurationStore(options =>
            {
                options.ConfigureDbContext = builder =>
                    builder.UseSqlServer(connectionString,
                        sql => sql.MigrationsAssembly(migrationsAssembly));
            })
            // this adds the operational data from DB (codes, tokens, consents)
            .AddOperationalStore(options =>
            {
                options.ConfigureDbContext = builder =>
                    builder.UseSqlServer(connectionString,
                        sql => sql.MigrationsAssembly(migrationsAssembly));

                // this enables automatic token cleanup. this is optional.
                options.EnableTokenCleanup = true;
                options.TokenCleanupInterval = 30;
            });

MVCClient配置

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

                options.Authority = "http://localhost:5000";
                options.RequireHttpsMetadata = false;

                options.ClientId = "mvc";
                options.ClientSecret = "secret";
                options.ResponseType = "code id_token";

                options.SaveTokens = true;
                options.GetClaimsFromUserInfoEndpoint = true;

                options.Scope.Add("api1");
                options.Scope.Add("openid");
                options.Scope.Add("profile");
                options.Scope.Add("role");
                options.Scope.Add("offline_access");
            });

API配置

services.AddAuthentication("Bearer")
            .AddIdentityServerAuthentication(options =>
            {
                options.Authority = "http://localhost:5000";
                options.RequireHttpsMetadata = false;

                options.ApiName = "api1";
            });

请建议如何在身份服务器4的身份验证过程中添加自定义声明,可以在MvcClient应用程序中访问?

注意:我使用IProfileService添加的任何声明都可以在API中使用,但这些声明在MvcClient应用程序中不可用。所以我猜所有自定义声明都包含在访问令牌中,但我不知道为什么我们能够在MvcClient应用程序中访问此声明。

0 个答案:

没有答案