Identity Server 4:从MVC客户端正确注销

时间:2018-11-30 10:55:07

标签: c# asp.net asp.net-mvc-4 asp.net-identity identityserver4

我遇到了IdentityServer 4中的注销功能的麻烦。 我的IS4应用程序主要是其网站上教程的结果,因此它们并不是真正的自定义行为。我也使用ASP.net Core Identity。 我有一个MVC客户端(同样,基本上是项目模板)。我只是在“索引”页面顶部添加了“注销”按钮,以注销当前已通过身份验证的用户。

这是我的MVC客户端中的注销方法:

public async Task Logout()
{
    await HttpContext.SignOutAsync("Cookies");
    await HttpContext.SignOutAsync("oidc");
}

这正是本教程所说的。

这是MVC Client的Startup.cs中的配置:

services.AddAuthentication(options =>
{
    options.DefaultScheme = "Cookies";
    options.DefaultChallengeScheme = "oidc";
})
.AddCookie("Cookies")
.AddOpenIdConnect("oidc", options =>
{
    options.SignInScheme = "Cookies";

    options.Authority = "http://localhost:5000";
    options.RequireHttpsMetadata = false;
    options.CallbackPath = new PathString("/Home/");

    options.ClientId = "Core.WebUI";
    options.ClientSecret = "secret";
    options.ResponseType = "code id_token";

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

    options.Scope.Add("offline_access");                    
});

没什么... 现在,IS4应用程序中的MVC客户端配置:

new Client
{
    ClientId = "Core.WebUI",
    ClientName = "MVC Client",
    ClientSecrets = new List<Secret>
    {
        new Secret("secret".Sha256())
    },
    AllowedGrantTypes = GrantTypes.HybridAndClientCredentials,
    RequireConsent = false,

    // where to redirect to after login
    RedirectUris = { "http://localhost:5011/Home/" },

    // where to redirect to after logout
    PostLogoutRedirectUris = { "http://localhost:5011/Home/" },
    AlwaysSendClientClaims = true,
    AlwaysIncludeUserClaimsInIdToken = true,
    AllowedScopes =
    {
        IdentityServerConstants.StandardScopes.OpenId,
        IdentityServerConstants.StandardScopes.Profile
    },
    AllowOfflineAccess = true
}

同样,大部分都是本教程所说的。 我的问题是: 当用户连接后,然后单击注销按钮,我将被重定向到注销页面中的IS4应用程序,并说我已经注销了。但是实际上,我不是,因为如果返回我的MVC,我仍然可以访问受保护的功能(带有Authorize属性)。为了正确注销我的用户,一旦我进入D4应用程序的注销页面,我就必须单击IS4应用程序的注销按钮...只有这样我才能正确注销... < / p>

我想要的是,当我单击MVC客户端上的“注销”按钮时,我会真正注销,然后直接重定向到MVC客户端的主页(没有“您现在已注销”页面)

对于IS4和ADP.NET来说我还很陌生,因此非常欢迎提供任何帮助...谢谢!

3 个答案:

答案 0 :(得分:1)

最好不要使用魔术字符串,而是:

  return new SignOutResult(new[]
            {
                CookieAuthenticationDefaults.AuthenticationScheme, 
                OpenIdConnectDefaults.AuthenticationScheme
            });

答案 1 :(得分:0)

您尝试过

8000

答案 2 :(得分:0)

这是我解决此问题的方法:

    public IActionResult LogOff()
    {
        return new SignOutResult(new[] { "oidc", "Cookies" });
    }