【问题标题】:ASP.NET Core API Authentication with JWT breaks built-in authentication for website使用 JWT 的 ASP.NET Core API 身份验证破坏了网站的内置身份验证
【发布时间】:2020-09-19 04:18:12
【问题描述】:

我正在开发一个拥有网站和 API 的 ASP.NET Core 项目。我需要通过某种方式保护 API,所以我实现了 JWT 身份验证。这按预期工作,API 只能通过使用有效令牌进行的调用来访问。

问题是,网站上的内置登录功能不再起作用。 这是我添加到 Startup.cs 的代码:

services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
    .AddJwtBearer(o =>
    {
        o.TokenValidationParameters = new TokenValidationParameters
        {
            ValidateIssuer = true,
            ValidateAudience = true,
            ValidateLifetime = true,
            ValidateIssuerSigningKey = true,
            ValidIssuer = Configuration["Jwt:Issuer"],
            ValidAudience = Configuration["Jwt:Issuer"],
            IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(Configuration["Jwt:Key"]))
        };
    });

如果我删除此代码,内置登录功能将照常工作,但 API 不再工作。

有没有办法让 JWT 身份验证仅适用于 API 控制器?或者有没有办法让内置身份验证使用 JWT?

【问题讨论】:

    标签: c# asp.net-core jwt


    【解决方案1】:

    我遇到了同样的问题并解决了(使用 Asp.Net Core 3.0)。
    您可以使用这样的代码向您的项目添加多个身份验证架构。

    // Read the token generation data...
    var token = Configuration.GetSection("JwtTokenData").Get<JwtTokenData>();
    
    services.AddAuthentication()
            .AddCookie(options =>
            {
                options.LoginPath = $"/Identity/Account/Login";
                options.AccessDeniedPath = $"/Identity/Account/AccessDenied";
            })
            .AddJwtBearer(options => {
                options.SaveToken = true;
                options.TokenValidationParameters = new TokenValidationParameters
                {
                    ValidateIssuerSigningKey = true,
                    IssuerSigningKey = new SymmetricSecurityKey(Encoding.ASCII.GetBytes(token.Secret)),
                    ValidIssuer = token.Issuer,
                    ValidAudience = token.Audience,
                    ValidateIssuer = false,
                    ValidateAudience = false
                };
            });
    

    请注意,当我调用 AddAuthentication 时,我没有指定默认身份验证架构。这允许内置身份验证成为您使用 [Authorize] 属性的页面或控制器的默认设置。

    但是当您需要使用 JWT 身份验证时,您可以在 Web API 控制器或方法的 Authorize 属性上使用此选项

    [Authorize(AuthenticationSchemes = JwtBearerDefaults.AuthenticationScheme)]
    

    【讨论】:

    • 你也可以只使用[Authorize(AuthenticationSchemes = "Bearer"]属性,它更短。
    猜你喜欢
    • 2018-03-01
    • 2018-01-28
    • 2019-09-06
    • 2021-04-20
    • 2019-09-03
    • 2019-07-17
    • 2017-07-30
    • 2017-03-09
    相关资源
    最近更新 更多