如何使 ASP.Net Core Web API Identity return 未经授权的 401
How to make ASP.Net Core Web API Identity return a 401 on unauthorized
我正在尝试让 ASP.net 核心网络 api JSON Web 令牌身份验证正常工作。我已经到了成功将 IdentityServer4 与应用程序集成的地步,并且它正在根据 ASP.net Core Identity 成功处理登录。
但是,每当身份验证失败时,API return 都会尝试将客户端重定向到登录页面,并返回 302 结果。但是,这是一个纯 Web API,没有用户页面,也没有用户应该直接与之交互的任何内容。
如何让系统 return 401 而不是尝试重定向到登录页面?
ConfigureServices 的标识部分如下所示:
// ASP.net Identity
var identityBackingStoreConnectionString = configuration["identity:backingStore"];
services
.AddIdentityWithMongoStoresUsingCustomTypes<MyApplicationUser, IdentityRole>(
identityBackingStoreConnectionString)
.AddDefaultTokenProviders();
services.AddSingleton<IClientStore, MyIdentityStore>();
// IdentityServer4
services.AddIdentityServer().AddTemporarySigningCredential()
.AddInMemoryApiResources(MyResourceStore.GetAllResources())
.AddAspNetIdentity<MyApplicationUser>()
.AddTemporarySigningCredential();
Configure 的相关(我认为)部分如下所示:
app.UseIdentity();
app.UseIdentityServer();
app.UseIdentityServerAuthentication(new IdentityServerAuthenticationOptions()
{
Authority = "http://localhost:5000/",
RequireHttpsMetadata = false,
ApiName = "myapi",
AutomaticAuthenticate = true,
JwtBearerEvents = new JwtBearerEvents()
{
OnAuthenticationFailed = async context => context.Response.StatusCode = 401
}
});
app.UseMvc();
如您所见,我已尝试覆盖 OnAuthenticationFailed 事件,但无济于事。
任何关于如何获得系统 returning 401 的建议将不胜感激。
身份服务器在内部使用 cookie 身份验证,将 401 转换为 302。
我不认为你可以因此让 app.UseIdentityServer()
和 app.UseIdentityServerAuthentication()
住在一起。
但是您可以轻松找到解决方法。
最好在单独的应用程序中托管身份服务器(例如,身份服务器位于 localhost:5000,应用程序位于 localhost:5001) .它更符合 open id connect 的概念,您可以在 official GitHub
享受大量示例
或者您可以尝试将身份服务器和 API 放置在不同的子路径中,例如 localhost:5000/idsrv 和 localhost:5000/api 使用 app.UseWhen
。例如
app.UseWhen(
c => c.Request.Path.StartsWithSegments(new PathString("/api")),
branch => {
branch.UseIdentityServerAuthentication(new IdentityServerAuthenticationOptions()
{
Authority = "http://localhost:5000/idsrv",
RequireHttpsMetadata = false,
ApiName = "myapi",
AutomaticAuthenticate = true,
} );
branch.UseMvc();
});
app.UseWhen(
c => c.Request.Path.StartsWithSegments(new PathString("/idsrv")),
branch => {
branch.UseIdentityServer();
branch.UseMvc();
} );
同样,这种方法更容易出错,我宁愿考虑单独的应用程序。
我正在尝试让 ASP.net 核心网络 api JSON Web 令牌身份验证正常工作。我已经到了成功将 IdentityServer4 与应用程序集成的地步,并且它正在根据 ASP.net Core Identity 成功处理登录。
但是,每当身份验证失败时,API return 都会尝试将客户端重定向到登录页面,并返回 302 结果。但是,这是一个纯 Web API,没有用户页面,也没有用户应该直接与之交互的任何内容。
如何让系统 return 401 而不是尝试重定向到登录页面?
ConfigureServices 的标识部分如下所示:
// ASP.net Identity
var identityBackingStoreConnectionString = configuration["identity:backingStore"];
services
.AddIdentityWithMongoStoresUsingCustomTypes<MyApplicationUser, IdentityRole>(
identityBackingStoreConnectionString)
.AddDefaultTokenProviders();
services.AddSingleton<IClientStore, MyIdentityStore>();
// IdentityServer4
services.AddIdentityServer().AddTemporarySigningCredential()
.AddInMemoryApiResources(MyResourceStore.GetAllResources())
.AddAspNetIdentity<MyApplicationUser>()
.AddTemporarySigningCredential();
Configure 的相关(我认为)部分如下所示:
app.UseIdentity();
app.UseIdentityServer();
app.UseIdentityServerAuthentication(new IdentityServerAuthenticationOptions()
{
Authority = "http://localhost:5000/",
RequireHttpsMetadata = false,
ApiName = "myapi",
AutomaticAuthenticate = true,
JwtBearerEvents = new JwtBearerEvents()
{
OnAuthenticationFailed = async context => context.Response.StatusCode = 401
}
});
app.UseMvc();
如您所见,我已尝试覆盖 OnAuthenticationFailed 事件,但无济于事。
任何关于如何获得系统 returning 401 的建议将不胜感激。
身份服务器在内部使用 cookie 身份验证,将 401 转换为 302。
我不认为你可以因此让 app.UseIdentityServer()
和 app.UseIdentityServerAuthentication()
住在一起。
但是您可以轻松找到解决方法。
最好在单独的应用程序中托管身份服务器(例如,身份服务器位于 localhost:5000,应用程序位于 localhost:5001) .它更符合 open id connect 的概念,您可以在 official GitHub
享受大量示例或者您可以尝试将身份服务器和 API 放置在不同的子路径中,例如 localhost:5000/idsrv 和 localhost:5000/api 使用 app.UseWhen
。例如
app.UseWhen(
c => c.Request.Path.StartsWithSegments(new PathString("/api")),
branch => {
branch.UseIdentityServerAuthentication(new IdentityServerAuthenticationOptions()
{
Authority = "http://localhost:5000/idsrv",
RequireHttpsMetadata = false,
ApiName = "myapi",
AutomaticAuthenticate = true,
} );
branch.UseMvc();
});
app.UseWhen(
c => c.Request.Path.StartsWithSegments(new PathString("/idsrv")),
branch => {
branch.UseIdentityServer();
branch.UseMvc();
} );
同样,这种方法更容易出错,我宁愿考虑单独的应用程序。