IdentityServer4 с AspNetIdentity. Как получить доступ WebApi к UserDb - PullRequest
0 голосов
/ 02 ноября 2018

настроена служба авторизации на IdentityServer4. База данных для него с доступом через webApi должна быть перемещена в отдельный проект.

доступ к webApi с пользователями возможен только авторизованным пользователям через IdentityServer4.

  1. L для IdentityServer4, это просто еще один API (диапазон), к которому вам необходимо предоставить доступ.

  2. для работы с пользователями необходимо использовать AspNetIdentity для доступа к UserManager <ApplicationUser> и RoleManager <ApplicationUser> службам

    Если я добавлю services.AddIdentity<ApplicationUser,IdentityRole>(), авторизация через IdentityServer4 перестанет работать. Если я не добавлю, то услуги UserManager<ApplicationUser> и RoleManager<ApplicationUser> недоступны.

Настройка webApi для пользователей

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

        services.AddIdentity<ApplicationUser, IdentityRole>()      // authorization with token (IdentityServer4) stops working
            .AddEntityFrameworkStores<ApplicationDbContext>()
            .AddDefaultTokenProviders();


        services.AddMvcCore()
            .SetCompatibilityVersion(CompatibilityVersion.Version_2_1)
            .AddAuthorization(options =>
            {
                options.AddPolicy("AdminsOnly", policyUser =>
                {
                    policyUser.RequireClaim("role", "admin");
                });
                options.AddPolicy("ManagerOnly", policyUser =>
                {
                    policyUser.RequireClaim("role", "manager");
                });
            })
            .AddJsonFormatters();

        services.AddAuthentication("Bearer")
            .AddIdentityServerAuthentication(options =>
            {
                options.Authority = "http://localhost:5000"; 
                options.RequireHttpsMetadata = false;         
                options.ApiName = "UserDbApi";                
                options.EnableCaching = true;
                options.CacheDuration = TimeSpan.FromMinutes(10);
            });

        services.AddCors(options =>        
        {
            options.AddPolicy("default", policy =>
            {
                policy.WithOrigins("http://localhost:5003")       //access Js client
                    .AllowAnyHeader()
                    .AllowAnyMethod();
            });
        });
    }

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

        app.UseCors("default");
        app.UseAuthentication();
        app.UseHttpsRedirection();
        app.UseMvc();
    }

Доступ к тестовому контроллеру

[Route("api/[controller]")]
[ApiController]
public class ValuesController : ControllerBase
{
    // GET api/values
    [HttpGet]
    [Authorize(Roles = "SuperAdmin")]
    public ActionResult<IEnumerable<string>> Get()
    {
      // Access works only with a token issued by IdentityServer4
    }
}

Js клиент

var config = {
    authority: "http://localhost:5000",
    client_id: "js",
    redirect_uri: "http://localhost:5003/callback.html",
    response_type: "id_token token",
    scope: "openid profile custom.profile api1 UserDbApi",
    post_logout_redirect_uri: "http://localhost:5003/index.html",
    checkSessionInterval: 30000,
    revokeAccessTokenOnSignout: true,
    automaticSilentRenew: true,
    silent_redirect_uri: 'http://localhost:5003/callback-silent.html',
    accessTokenExpiringNotificationTime: 60
};
var mgr = new Oidc.UserManager(config);

function getInfo() {
    mgr.getUser().then(function (user) {
        var url = "https://localhost:7000/api/values";

        var xhr = new XMLHttpRequest();
        xhr.open("GET", url);
        xhr.onload = function () {
            log(xhr.status, JSON.parse(xhr.responseText));
        }
        xhr.setRequestHeader("Authorization", "Bearer " + user.access_token);
        xhr.send();
    });
}

Мне мешает авторизация, предоставленная AspNetIdentity !!!

Пожалуйста, помогите!

...