Использование авторизации на основе ролей IS4 - PullRequest
0 голосов
/ 07 мая 2020

Это вопрос, состоящий из нескольких частей, в основном потому, что я новичок в IS4 и использую SSO как средство авторизации в целом.

Моя цель - разрешить моим пользователям просматривать различные части приложения MVC в зависимости от их роли, которая хранится на сервере IS4.

Я использую быстрый запуск IdentityServerAspNetIdentity, который я подключил к своей базе данных AspNetIdentity.

Вот IS4 ConfigureServices:

services.AddDbContext<ApplicationDbContext>(options => options.UseNpgsql(Configuration.GetConnectionString("IdentityContext")));

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

services.AddIdentityServer(options =>
    {
        options.Events.RaiseErrorEvents = true;
        options.Events.RaiseInformationEvents = true;
        options.Events.RaiseFailureEvents = true;
        options.Events.RaiseSuccessEvents = true;
    })
    .AddConfigurationStore<ConfigurationDbContext>(configDb =>
    {
        configDb.ConfigureDbContext = db => db.UseNpgsql(Configuration.GetConnectionString("QuickstartContext"),
            sql => sql.MigrationsAssembly(typeof(Startup).GetTypeInfo().Assembly.GetName().Name));
    })
    .AddOperationalStore<PersistedGrantDbContext>(operationDb =>
    {
        operationDb.ConfigureDbContext = db => db.UseNpgsql(Configuration.GetConnectionString("QuickstartContext"),
            sql => sql.MigrationsAssembly(typeof(Startup).GetTypeInfo().Assembly.GetName().Name));
    })
    .AddAspNetIdentity<ApplicationUser>()
    .AddProfileService<CustomClaimService>()
    .AddDeveloperSigningCredential();       // not recommended for production - you need to store your key material somewhere secure       

services.AddTransient<IProfileService, CustomClaimService>();

И на моем MVC клиенте:

public void ConfigureServices(IServiceCollection services)
{
    services.AddControllersWithViews();

    JwtSecurityTokenHandler.DefaultMapInboundClaims = false;

    services.AddAuthentication(options =>
    {
        options.DefaultScheme = "Cookies";
        options.DefaultChallengeScheme = "oidc";
    })
        .AddCookie("Cookies")
        .AddOpenIdConnect("oidc", options =>
        {
            options.Authority = "https://localhost:5000";
            options.RequireHttpsMetadata = false;

            options.ClientId = "mvc";
            options.ClientSecret = "49C1A7E1-0C79-4A89-A3D6-A37998FB86B0";
            options.ResponseType = "code";
            options.SaveTokens = true;
            options.GetClaimsFromUserInfoEndpoint = true;
            options.Scope.Add("api1");
            options.Scope.Add("offline_access");
            options.Scope.Add("profile");
            options.Scope.Add("test");
            options.CallbackPath = "/Home/SignIn";

        });

    services.AddAuthorization(options =>
    {
        options.AddPolicy("admin", policyAdmin =>
        {
            policyAdmin.RequireClaim("role", "admin");
        });
    });
}

Мой пользователь может войти через IS4 нормально, и я претензии можно увидеть на моей индексной странице

@using Microsoft.AspNetCore.Authentication

<h2>Claims</h2>

<dl>
    @foreach (var claim in User.Claims)
    {
        <dt>@claim.Type</dt>
        <dd>@claim.Value</dd>
    }
</dl>

<h2>Properties</h2>

<dl>
    @foreach (var prop in (await Context.AuthenticateAsync()).Properties.Items)
    {
        <dt>@prop.Key</dt>
        <dd>@prop.Value</dd>
    }
</dl>

Однако некоторые претензии пользователей отсутствуют в этом представлении. Я добавил утверждение «роль» в созданную мной область с именем «test». У моего пользователя есть это утверждение в AspNetUserClaims, если я отлаживаю на сервере IS4, я вижу утверждение в Context.Subject.

Но после входа в систему и перенаправления обратно в мое приложение MVC это утверждение больше не там. Я не знаю, почему претензия не поступает и захожу в тупик.

Любая помощь будет принята с благодарностью, кроме того, есть ли лучшие способы интеграции AspNetUserRoles с IS4?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...