【问题标题】:Secure ASP.NET Core 3.1 MVC app with KeyCloak使用 KeyCloak 保护 ASP.NET Core 3.1 MVC 应用程序
【发布时间】: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 存储库或一个简单示例来说明如何使用 KeyCloak 保护 ASP.NET Core 3.1 MVC 应用程序,我将不胜感激。提前非常感谢。

【问题讨论】:

    标签: asp.net-core-mvc keycloak asp.net-core-3.1


    【解决方案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 (stackoverflow.com/questions/41721032/…) 的回答。 RBAC 正在工作,但在 jwt.io 中进行检查时,我在访问令牌中看不到角色和配置文件参数。
    猜你喜欢
    • 2021-06-28
    • 2021-05-17
    • 1970-01-01
    • 1970-01-01
    • 2021-06-25
    • 2021-05-17
    • 1970-01-01
    • 2018-08-15
    • 2020-07-10
    相关资源
    最近更新 更多