使用 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 应用程序的主要内容,如果未能解决你的问题,请参考以下文章

ASP.NET Core 的 Keycloak 客户端

除了 keycloak 令牌之外,我还需要其他任何东西来访问使用 keycloak 保护的服务吗?

如何使用 HTTP 连接通过托管在 IIS 上的 ASP.NET 成员身份保护 ASP.NET Web API [重复]

使用 ASP.net 表单身份验证保护 MS Access 前端应用程序

使用 keycloak 保护特定的反应页面

ASP.NET - 受保护的变量