如何仅为ASP.NET 5中的受保护操作添加令牌验证(ASP.NET Core)

时间:2016-01-25 14:54:05

标签: authentication oauth asp.net-core jwt openid-connect

我在我的应用程序中添加了一个JWT中间件:

<li>

现在,如果我的令牌未验证(例如已过期),我仍然会收到生命周期验证未通过的错误。有没有办法让中间件仅为受保护资源验证令牌?如果没有,那么我应该如何以及在哪里调用中间件自己(将令牌读入HttpContext.User)?

P.S这是我添加保护的方式:

<li class="lifecycle-state taskpanel-select-option" role="presentation" tabindex= "0">
    <a href="#" role="menuitem">
        <span data-bind="text: StateName"/>
        <span class="lifecycle-stateId" data-bind="text: StateId"/>
    </a>
</li>

这就是我允许公众访问的方式:

app.UseJwtBearerAuthentication(options => { options.AutomaticAuthenticate = true;} )

澄清:如果没有令牌,这将有效,但如果令牌无效(例如已过期),即使公共资源将无法访问,也会抛出500(由于某些内部错误导致401应该真的存在)。

1 个答案:

答案 0 :(得分:3)

首先,您需要通过在JWT承载选项中将 AutomaticAuthentication 设置为 false 来停用自动身份验证。

为确保针对特定操作调用JWT承载中间件,您可以使用 AddAuthenticationSchemes 创建自己的授权策略:

public void ConfigureServices(IServiceCollection services) {
    services.AddAuthorization(options => {
        options.AddPolicy("API", policy => {
            policy.AddAuthenticationSchemes(JwtBearerDefaults.AuthenticationScheme);
            policy.RequireAuthenticatedUser();
        });
    });
}

然后,使用Authorize属性装饰您的控制器操作:

[Authorize(Policy = "API")]
[HttpGet("your-action")]
public IActionResult Action() {
    ...
}