我的SPA应用程序(使用Aurelia)调用我的ASP.NET Core 2 Web API。我需要使用Google OIDC提供程序对用户进行身份验证,并使用相同的方法保护Web API。
目前,我可以在客户端(SPA)端对用户进行身份验证,并检索id令牌和访问令牌。每次API调用,我都会在标头中发送访问令牌。
现在我不确定如何处理服务器端来验证令牌并授予或拒绝访问API。我按照官方文档如何添加外部登录提供程序,但它似乎只适用于服务器端MVC应用程序。
有什么简单的方法可以做到这一点吗?
我认为例如IdentityServer4可以支持这种情况,但在我看来,我需要做的事情太复杂了。毕竟我不需要自己的身份/授权服务器。
更新
根据Miroslav Popovic的回答,我对ASP.NET Core 2.0的配置如下所示:
public void ConfigureServices(IServiceCollection services)
{
services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme).AddJwtBearer(o =>
{
o.Authority = "https://accounts.google.com";
o.TokenValidationParameters = new TokenValidationParameters
{
ValidIssuer = "accounts.google.com",
ValidAudience = "xxxxxxxxxxxxx.apps.googleusercontent.com",
ValidateAudience = true,
ValidateIssuer = true
};
});
services.AddMvc();
}
我在Configure()
致电app.UseAuthentication()
。
使用此设置时,我收到失败消息 No SecurityTokenValidator可用于令牌。
更新2:
我做到了。服务器配置正确。问题是我将access_token发送到API而不是id_token。
答案 0 :(得分:4)
由于您已拥有访问令牌,因此使用它来添加身份验证应该不会太难。你需要这些东西(未经测试):
// Inside Startup.cs, ConfigureServices method
services
.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddJwtBearer(
options =>
{
var tokenValidationParameters = new TokenValidationParameters
{
ValidIssuer = "accounts.google.com",
ValidateAudience = false
};
options.MetadataAddress = "https://accounts.google.com/.well-known/openid-configuration";
options.TokenValidationParameters = tokenValidationParameters;
});
// Inside Startup.cs, Configure method
app.UseAuthentication(); // Before MVC middleware
app.UseMvc();
// And of course, on your controllers:
[Authorize]
public class MyApiController : Controller
来自Paul Rowe的This post可能会提供更多帮助,但请注意,它是为ASP.NET Core 1.x编写的,而身份验证API在2.0中有所改变。
此处还有很多关于SO的信息,例如this question。