Почему я теряю Client PostLogoutRedirectUris при выходе из приложения? - PullRequest
0 голосов
/ 01 июня 2019

Я устанавливаю простое mvc-приложение asp.net Core 2, которое аутентифицируется на внешнем IdentityServer4.Все прекрасно работает, пока я не попытался реализовать приложение локального пользовательского магазина.Когда я добавляю базовый сервис. AddIdentity ... в Startup, я могу войти в систему нормально, но выход больше не будет автоматически перенаправлять обратно в приложение.Кажется, я теряю PostLogoutRedirectUri.Мне интересно, если мне нужно сделать некоторые сопоставления утверждений idsrv с локальными утверждениями при входе в систему, но не уверен.Единственная разница между работой и не работой заключается в том, что я добавляю эти несколько строк.

services.AddIdentity<IdentityUser, IdentityRole>(options => { })
            .AddEntityFrameworkStores<ApplicationDbContext>()
            .AddDefaultTokenProviders();

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

Я попробовал предложения здесь:

 public void ConfigureServices(IServiceCollection services)
    {

        services.AddDbContext<ApplicationDbContext>(options =>
            options.UseSqlServer(ContextConnection));

        services.AddMvc()
        .AddRazorPagesOptions(options =>
        {
            options.Conventions.AuthorizePage("/api");
        })
        .SetCompatibilityVersion(CompatibilityVersion.Version_2_2);

        services.AddScoped<IApplicationDbContext, ApplicationDbContext>();

        JwtSecurityTokenHandler.DefaultInboundClaimTypeMap.Clear();

        services.AddIdentity<IdentityUser, IdentityRole>(options => { })
            .AddEntityFrameworkStores<ApplicationDbContext>()
            .AddDefaultTokenProviders(); 




        services.AddAuthentication(options =>
        {
            options.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme;
            options.DefaultChallengeScheme = "oidc";

        })

        .AddCookie(options =>
        {

            options.ExpireTimeSpan = TimeSpan.FromMinutes(60);
            options.Cookie.Name = "mycookie";
        })
      .AddAutomaticTokenManagement()
        .AddOpenIdConnect("oidc", options =>
        {
            options.Authority = "https://localhost:44345";
            options.RequireHttpsMetadata = false;
            options.ClientSecret = "secret";
            options.ClientId = "myapp";
            options.ResponseType = "code id_token";
            options.Scope.Clear();
            options.Scope.Add("openid");
            options.Scope.Add("profile");
            options.Scope.Add("email");
            options.Scope.Add("hdiapi");
            options.Scope.Add("offline_access");

            options.ClaimActions.MapAll();
            //options.ClaimActions.MapAllExcept("iss", "nbf", "exp", "aud", "nonce", "iat", "c_hash");

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

            options.TokenValidationParameters = new TokenValidationParameters
            {
                NameClaimType = JwtClaimTypes.Name,
                RoleClaimType = JwtClaimTypes.Role,
            };
        });
enter code here

AccountControler

public IActionResult Logout()
{
    var properties = new AuthenticationProperties
    {
        RedirectUri = Url.Action("https://localhost:44375/signout-callback-oidc"),
        Items = { { "scheme", "oidc" } }
    };

    return new SignOutResult(new[] { "Cookies", "oidc" }
    ,properties);
}



[HttpGet]
public async Task<IActionResult> ExternalLoginCallback()
{

    // read external identity from the temporary cookie
    //var result = await HttpContext.AuthenticateAsync(IdentityServerConstants.ExternalCookieAuthenticationScheme);
    var result = await HttpContext.AuthenticateAsync("oidc");
    if (result?.Succeeded != true)
    {
        throw new Exception("External authentication error");
    }

    // retrieve claims of the external user
    var externalUser = result.Principal;
    if (externalUser == null)
    {
        throw new Exception("External authentication error");
    }

    // retrieve claims of the external user
    var claims = externalUser.Claims.ToList();

    // try to determine the unique id of the external user - 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 = claims.FirstOrDefault(x => x.Type == JwtClaimTypes.Subject);
    if (userIdClaim == null)
    {
        userIdClaim = claims.FirstOrDefault(x => x.Type == ClaimTypes.NameIdentifier);
    }
    if (userIdClaim == null)
    {
        throw new Exception("Unknown userid");
    }

    var externalUserId = userIdClaim.Value;
    var externalProvider = userIdClaim.Issuer;

    // use externalProvider and externalUserId to find your user, or provision a new user

    //var result = await HttpContext.AuthenticateAsync("oidc");

    //var externalUserId = result.Principal.FindFirstValue("sub")
    //                     ?? result.Principal.FindFirstValue(ClaimTypes.NameIdentifier)
    //                     ?? throw new Exception("Cannot find external user id");
    //var provider = result.Properties.Items["scheme"];

    //await HttpContext.SignInAsync("Cookies", result.Principal);


    return RedirectToAction("Index");
}

Я не вижу никаких исключенийЯ вышел из IDSRV, но он не перенаправляется обратно в приложение

...