IdentityServer4 SQLite Ошибка 1: «нет такой таблицы: AspNetUserLogins» - PullRequest
0 голосов
/ 13 июня 2018

Я пытаюсь использовать IdentityServer4 и просто придерживаться его реализации в памяти.Я в основном использую 6_ASPNetIdentity из примеров быстрого запуска.

Код хорошо работает в localhost, но после публикации его на сервере в IIS я получаю SQLite Ошибка 1: «нет такой таблицы: AspNetUserLogins».

Файл базы данных находится в корневой папке содержимого приложения и имеет право доступа к файлу.И после проверки у него есть таблица AspNetUserLogins enter image description here

Вот фрагмент из файла Startup.cs:

public Startup(IConfiguration configuration, IHostingEnvironment env)
    {
        var builder = new ConfigurationBuilder()
            .SetBasePath(env.ContentRootPath)
            .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
            .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true)
            .AddEnvironmentVariables();

        Configuration = builder.Build();
        Environment = env;
    }

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddDbContext<ApplicationDbContext>(options =>
            options.UseSqlite($"Data Source={Environment.ContentRootPath}/AspIdUsers.db"));

        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.GetApiResources())
            .AddInMemoryClients(Config.GetClients())
            .AddAspNetIdentity<ApplicationUser>();

И в AccountController.cs , ошибка может быть отслежена в ExternalLoginCallback

    /// <summary>
    /// Post processing of external authentication
    /// </summary>
    [HttpGet]
    public async Task<IActionResult> ExternalLoginCallback()
    {
        // read external identity from the temporary cookie
        var result = await HttpContext.AuthenticateAsync(IdentityConstants.ExternalScheme);
        if (result?.Succeeded != true)
        {
            throw new Exception("External authentication error");
        }

        // lookup our user and external provider info
        var (user, provider, providerUserId, claims) = await FindUserFromExternalProviderAsync(result);

, который указывает на этот метод:

private async Task<(ApplicationUser user, string provider, string providerUserId, IEnumerable<Claim> claims)> 
        FindUserFromExternalProviderAsync(AuthenticateResult result)
    {
        var externalUser = result.Principal;

        // try to determine the unique id of the external user (issued by the provider)
        // the most common claim type for that are the sub claim and the NameIdentifier
        // depending on the external provider, some other claim type might be used
        var userIdClaim = externalUser.FindFirst(JwtClaimTypes.Subject) ??
                          externalUser.FindFirst(ClaimTypes.NameIdentifier) ??
                          throw new Exception("Unknown userid");

        // remove the user id claim so we don't include it as an extra claim if/when we provision the user
        var claims = externalUser.Claims.ToList();
        claims.Remove(userIdClaim);

        var provider = result.Properties.Items["scheme"];
        var providerUserId = userIdClaim.Value;

        // find external user
        var user = new ApplicationUser();
        try
        {
            user = await _userManager.FindByLoginAsync(provider, providerUserId);
        }
        catch (Exception ex)
        {

            throw(ex);
        }


        return (user, provider, providerUserId, claims);
    }

Я получаюИсключение при попытке сделать:

user = await _userManager.FindByLoginAsync(provider, providerUserId);

Может кто-нибудь, пожалуйста, просветите меня об этом.Что мне здесь не хватает?

...