使用 KeyCloak 保护 ASP.NET Core 3.1 MVC 应用程序
Posted
技术标签:
【中文标题】使用 KeyCloak 保护 ASP.NET Core 3.1 MVC 应用程序【英文标题】:Secure ASP.NET Core 3.1 MVC app with KeyCloak 【发布时间】:2021-08-04 12:33:48 【问题描述】:我正在尝试使用 KeyCloak 保护我的 ASP.NET Core 3.1 MVC 应用程序。
我尝试了几件事:
我使用了一些可用的示例,但它们要么已被弃用,要么已在 .NET Core 2.1 中完成 我找到了一些适用于 .NET Core 的 KeyCloak 适配器,但它们的维护时间不长。 我从thinktecture-labs webinar for keycloak 找到了一个 GitHub 存储库,用于保护 Angular 应用和 API,但无法弄清楚 KeyCloak 客户端配置以及如何以类似方式将其连接到 ASP.NET Core MVC 应用。如果您能指导我使用任何博客、GitHub 存储库或一个简单示例来说明如何,我将不胜感激。提前非常感谢。
【问题讨论】:
【参考方案1】:您无需使用特定于 keycloak 的库即可将 Keycloak 与 ASP.NET Core 3.1 集成。您可以改用 JWT 令牌认证/授权库。
示例: 将以下行添加到您的 appsettings.json 文件中。请不要忘记将部分更改为您的领域名称。
"JWT":
"Issuer": "https://<keycloakdomain>/auth/realms/<realmname>",
"Audience": "account, <realmname>, <anotherrealmname>"
您可以在您的 startup.cs 文件中键入以下代码。
services.AddAuthentication(x =>
x.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
x.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
x.DefaultSignInScheme = JwtBearerDefaults.AuthenticationScheme;
)
.AddJwtBearer(x =>
x.Authority = Configuration["JWT:Issuer"];
x.IncludeErrorDetails = true;
x.SaveToken = true;
x.Events = new JwtBearerEvents
OnAuthenticationFailed = context => return Task.CompletedTask; ,
OnTokenValidated = context => return Task.CompletedTask;
;
x.RequireHttpsMetadata = false;
x.SaveToken = true;
x.TokenValidationParameters = new TokenValidationParameters()
ValidateAudience = true,
ValidAudiences = (Configuration["JWT:Audience"]).Split(','),
ValidateIssuerSigningKey = true,
ValidateIssuer = true,
ValidIssuer = Configuration["JWT:Issuer"],
ValidateLifetime = false
;
x.Validate();
x.Events = new JwtBearerEvents()
OnAuthenticationFailed = autFailed =>
autFailed.NoResult();
autFailed.Response.StatusCode = 401;
autFailed.Response.ContentType = "text/plain";
return autFailed.Response.WriteAsync(autFailed.Exception.ToString());
;
);
在这些操作之后,您可以通过发送 Bearer ... 作为 Authorization 标头值来查看令牌验证。
【讨论】:
非常感谢@OnderD 的及时回复。我想知道如何为此客户端配置 KeyCloak,选择哪种“访问类型”,“机密”或“仅承载”?如何配置它以使其适用于基于角色的授权? 您可以选择“机密”。您可以为 RBAC 选择 Authorization Enable = true 那我应该如何在我的Startup.cs或者appsettings.json中引入ClientId和ClientSecret。我可以在控制器的操作中引入角色,例如 [Authorize(Roles = "Customer-Admin")]?我为这种方法找到的大部分信息都是针对 Core API 的,但我找不到任何适合 MVC 的信息。您认为这种方法对 .Net Core MVC 应用程序有好处吗?我遵循@Imagin8 (***.com/questions/41721032/…) 的回答。 RBAC 正在工作,但在 jwt.io 中进行检查时,我在访问令牌中看不到角色和配置文件参数。以上是关于使用 KeyCloak 保护 ASP.NET Core 3.1 MVC 应用程序的主要内容,如果未能解决你的问题,请参考以下文章
除了 keycloak 令牌之外,我还需要其他任何东西来访问使用 keycloak 保护的服务吗?
如何使用 HTTP 连接通过托管在 IIS 上的 ASP.NET 成员身份保护 ASP.NET Web API [重复]