Безопасный основной веб-интерфейс asp.net с использованием атрибутов авторизации + идентификационный сервер 4 - PullRequest
0 голосов
/ 20 ноября 2018

Мне удалось настроить Identity Server 4, используя is4aspid из их шаблонов , и, похоже, он работает нормально.Сейчас я пытаюсь защитить веб-интерфейс с помощью Asp.net Core 2.0.Authorize, кажется, работает, но когда я пытаюсь использовать [Authorize(Roles ="Admin")] в моем методе контроллера, он не будет работать.

Я посмотрел это видео и попытался сделать то, что онисделал, но я не могу найти хороший кусок кода, который они используют, например AuthorizationProviderClient или app.UseAuthorizationProvider()

Это метод Startup.cs ConfigureServices моего Identity Server:

public void ConfigureServices(IServiceCollection services)
    {
        services.AddDbContext<ApplicationDbContext>(options =>
            options.UseSqlServer (Configuration.GetConnectionString("DefaultConnection")));

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

        services.AddMvc();

        services.Configure<IISOptions>(iis =>
        {
            iis.AuthenticationDisplayName = "Windows";
            iis.AutomaticAuthentication = false;
        });

        var builder = services.AddIdentityServer(options =>
        {
            options.Events.RaiseErrorEvents = true;
            options.Events.RaiseInformationEvents = true;
            options.Events.RaiseFailureEvents = true;
            options.Events.RaiseSuccessEvents = true;
        })
            .AddInMemoryIdentityResources(Config.GetIdentityResources())
            .AddInMemoryApiResources(Config.GetApis())
            .AddInMemoryClients(Config.GetClients())
            .AddAspNetIdentity<ApplicationUser>();

        if (Environment.IsDevelopment())
        {
            builder.AddDeveloperSigningCredential();
        }
        else
        {
            throw new Exception("need to configure key material");
        }

        services.AddAuthentication()
            .AddGoogle(options =>
            {
                options.ClientId = "xxxx-xxxx.apps.googleusercontent.com";
                options.ClientSecret = "xxxxx";
            });
    }

А это класс конфигурации:

public static class Config
{
    public static IEnumerable<IdentityResource> GetIdentityResources()
    {
        return new IdentityResource[]
        {
            new IdentityResources.OpenId(),
            new IdentityResources.Profile()
        };
    }

    public static IEnumerable<ApiResource> GetApis()
    {
        return new ApiResource[]
        {
            //new ApiResource("api1", "My API #1") 
            new ApiResource("api1", "My API #1") { UserClaims = { "role" }  }
        };
    }

    public static IEnumerable<Client> GetClients()
    {
        return new[]
        {
            // https://www.scottbrady91.com/Angular/SPA-Authentiction-using-OpenID-Connect-Angular-CLI-and-oidc-client
            new Client {
                ClientId = "angular_spa",
                ClientName = "Intranet Web App",
                AllowedGrantTypes = GrantTypes.Implicit,
                AllowedScopes = new List<string> { "openid", "profile", "api1" },
                RedirectUris = new List<string> { "http://localhost:4200/auth-callback", "http://localhost:4200/silent-refresh.html" },
                PostLogoutRedirectUris = new List<string> { "http://localhost:4200/" },
                AllowedCorsOrigins = new List<string> { "http://localhost:4200" },
                AllowAccessTokensViaBrowser = true
            }
        };
    }
}

И это Startup.cs ConfigureServices моего WebApi:

        public void ConfigureServices(IServiceCollection services)
    {
        services.AddMvcCore()
            .AddAuthorization()
            .AddJsonFormatters();

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

                options.ApiName = "api1";
                options.EnableCaching = false;
                options.RoleClaimType = System.Security.Claims.ClaimTypes.Role;
            });
    }

А затем конфигурация:

        public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {
        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
        }           

        app.UseAuthentication();
        app.UseMvc();
    }

Вот как роли в базе данных: enter image description here

Я получил этот API из их примеров.Когда я отправляю токен на предъявителя с помощью Postman, атрибут Authorize работает нормально, теперь я хочу, чтобы роли также работали.Я пропустил пакет Nuget или что-то еще?

Заранее спасибо за любую помощь

...