我有一个使用IdentityServer4的ASP.Net Core 2 API。我想挑战所有对服务器的请求,如果用户未通过身份验证,则调用登录重定向,并在身份验证后回调特定的URL。
默认设置是仅在未经身份验证的用户请求受[Authorize]属性保护的资源时才调用登录重定向。在我的用例中,这是行不通的。
基本上,我希望功能等同于整个应用程序的[Authorize]属性,而不仅仅是特定的控制器。
最简单的方法是什么?在Startup.cs(services.AddAuthentication)中配置服务时可以使用设置吗?还是通过紧接app.UseAuthentication()之后的自定义中间件?
我尝试了以下自定义中间件,但说未配置处理程序。
ConfigureServices
services.AddAuthentication(IdentityServerAuthenticationDefaults.AuthenticationScheme)
.AddIdentityServerAuthentication(options =>
{
options.Authority = "https://localhost:4000";
options.ApiName = "myapi";
});
配置
app.UseAuthentication();
app.Use(async (context, next) =>
{
if (!context.User.Identity.IsAuthenticated)
{
await context.ChallengeAsync(IdentityServerAuthenticationDefaults.AuthenticationScheme, new AuthenticationProperties {RedirectUri= "https://localhost:5000/" });
}
else { await next.Invoke(); }
});
app.UseMvc();
答案 0 :(得分:0)
要为整个控制器配置[Authorize]
,可以尝试使用AuthorizeFilter
,如下所示
services.AddMvc(config => {
var policy = new AuthorizationPolicyBuilder()
.RequireAuthenticatedUser()
.Build();
config.Filters.Add(new AuthorizeFilter(policy));
})
.SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
对于重定向,您可以尝试配置UserInteraction.LoginUrl
services.AddIdentityServer(opt => {
opt.UserInteraction.LoginUrl = "/Identity/Account/LogIn";
})
.AddDeveloperSigningCredential()
.AddInMemoryPersistedGrants()
.AddInMemoryIdentityResources(Config.GetIdentityResources())
.AddInMemoryApiResources(Config.GetApiResources())
.AddInMemoryClients(Config.GetClients())
.AddAspNetIdentity<IdentityUser>();