Я устанавливаю простое 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, но он не перенаправляется обратно в приложение