帮我找出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"
然后切换到控制器方式,授权后又开始循环加载
您确定需要
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/*
)。