重定向至Keycloak

问题描述 投票:0回答:1

帮我找出Keycloak。我有一个纯 ASP.NET Core 6 MVC 项目。 我需要通过 Keycloak 启用授权和身份验证。

为此,我使用 OpenIdConnect。

代码:

services.AddAuthentication(options =>
{
    //Sets cookie authentication scheme  
    options.DefaultAuthenticateScheme = CookieAuthenticationDefaults.AuthenticationScheme;
    options.DefaultSignInScheme = CookieAuthenticationDefaults.AuthenticationScheme;
    options.DefaultChallengeScheme = OpenIdConnectDefaults.AuthenticationScheme;
})
.AddCookie(cookie =>
{
    cookie.Cookie.Name = "keycloak.cookie";
    cookie.Cookie.MaxAge = TimeSpan.FromMinutes(60);
    cookie.Cookie.SecurePolicy = CookieSecurePolicy.SameAsRequest;
    cookie.SlidingExpiration = true;
})
.AddOpenIdConnect(options =>
{ 
    options.SignInScheme = CookieAuthenticationDefaults.AuthenticationScheme;
    options.Authority = "http://localhost:8080/realms/ipn";
    options.ClientId = "IpcpAuth";
    options.ClientSecret = "Tns4Rli7UvsP72pkqqmOrIIBcEG6whVA";
    options.RequireHttpsMetadata = false;
    options.GetClaimsFromUserInfoEndpoint = true;
    options.Scope.Add("openid");
    options.Scope.Add("profile");
    options.Scope.Add("email");
    options.SaveTokens = true;
    options.ResponseType = OpenIdConnectResponseType.Code;
    options.NonceCookie.SameSite = SameSiteMode.None;
    options.CorrelationCookie.SameSite = SameSiteMode.None;
    options.TokenValidationParameters = new TokenValidationParameters
    {
        NameClaimType = "name",
        RoleClaimType = "https://schemas.scopic.com/roles"
    };
    options.Events.OnRedirectToIdentityProvider = async context =>
    {
        context.ProtocolMessage.RedirectUri = "https://localhost:44311/";
        await Task.FromResult(0);
    };
});

该项目有一个基本的家庭控制器。如果将属性

[Authorize]
放置到整个控制器,则重定向到Keycloak,授权成功后,不会发生正常的反向重定向。

我的屏幕很黑,页面正在循环重新加载。

您可以在打开新页面的控制器方法上放置一个属性。 然后项目打开,当您单击调用该方法的按钮时,keycloak 授权窗口将打开。授权后,重定向到主页,而不是该方法应打开的页面。

导致无法进入该页面;重定向始终返回主页。

如果我在这里指出这样的地址

context.ProtocolMessage.RedirectUri = "https://localhost:44311/Home/Privacy"

然后切换到控制器方式,授权后又开始循环加载

c# keycloak openid-connect asp.net-core-6.0
1个回答
0
投票

您确定需要

OnRedirectToIdentityProvider
吗?根据文档,您将覆盖 keycloak 登录调用的路径。也许这就是导致循环调用的原因。

我确实有一个可以使用 keycloak auth 的项目,并且我不必设置此参数。相反,我调整了登录页面以包含重定向参数,并像这样调用 keycloak 挑战者:

public async Task OnGet(string redirectUri = "/") {
    await HttpContext.ChallengeAsync("oidc", new AuthenticationProperties { RedirectUri = redirectUri });
}

App.razor
中,我重定向到此登录,包括重定向 URI:

<AuthorizeRouteView RouteData="@routeData" DefaultLayout="@typeof(MainLayout)">
    <NotAuthorized>
        @{
            if (context.User == null) {
                var returnUrl = UriHelper.ToBaseRelativePath(UriHelper.Uri);
                UriHelper.NavigateTo($"login?redirectUri={returnUrl}", forceLoad: true);
            } else {
                @:Not authorized!!!!
            }
        }
    </NotAuthorized>
</AuthorizeRouteView>

如果您没有显式设置返回 URI,请确保在 keycloak 客户端中设置

Home URL
。还要确保您的重定向 URL 位于 keycloak 客户端中的
Valid redirect URIs
字段内(在您的情况下可能类似于
https://localhost:44311/*
)。

© www.soinside.com 2019 - 2024. All rights reserved.