我还没有看到任何有关如何向SPA应用程序添加身份验证的文档/示例,例如,当使用ASP.NET Core 2.1上的模板进行react-redux时(该模板在后边使用了常用的create-react-app场景)。
为了澄清,我不是在问如何向React客户端应用程序添加Implicit Flow身份验证,我确实知道该怎么做,但是对于我们的客户来说还不够安全。我希望后端(ASP.NET Core)使用混合流通过OIDC身份提供程序处理身份验证。
我将以下内容添加到服务管道中:
services.AddAuthentication(o =>
{
o.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme;
o.DefaultChallengeScheme = OpenIdConnectDefaults.AuthenticationScheme;
})
.AddCookie(CookieAuthenticationDefaults.AuthenticationScheme, o =>;
{
o.SlidingExpiration = bool.Parse(Configuration["SessionCookieSlidingEnabled"]);
o.ExpireTimeSpan = TimeSpan.FromMinutes(int.Parse(Configuration["SessionCookieLifeTimeInMinutes"]));
o.Cookie = new CookieBuilder { HttpOnly = true };
})
.AddOpenIdConnect(OpenIdConnectDefaults.AuthenticationScheme, o =>
{
o.Authority = Configuration["Authority"];
o.ClientId = Configuration["OpenIdConnectOptions:ClientId"];
o.ClientSecret = Configuration["OpenIdConnectOptions:ClientSecret"];
o.SignInScheme = CookieAuthenticationDefaults.AuthenticationScheme;
o.GetClaimsFromUserInfoEndpoint = Convert.ToBoolean(Configuration["OpenIdConnectOptions:GetClaimsFromUserInfoEndpoint"]);
o.RequireHttpsMetadata = Convert.ToBoolean(Configuration["OpenIdConnectOptions:RequireHttpsMetadata"]);
o.ResponseType = Configuration["OpenIdConnectOptions:ResponseType"];
o.SaveTokens = Convert.ToBoolean(Configuration["OpenIdConnectOptions:SaveTokens"]);
o.UseTokenLifetime = false;
}
然后是configure方法对应的app.UseAuthentication();
。
此外,我(未成功)尝试在MVC服务上配置全局过滤器,如下所示:
services.AddMvc(options =>
{
var policy = new AuthorizationPolicyBuilder(OpenIdConnectDefaults.AuthenticationScheme)
.RequireAuthenticatedUser()
.Build();
options.Filters.Add(new AuthorizeFilter(policy));
})
过去,我只是将[Authorize]过滤器附加到主控制器上以触发流,但是显然从2.1开始,该框架使用SPA中间件从ClientApp文件夹中加载作为我的应用程序的入口点: / p>
app.UseSpa(spa =>
{
spa.Options.SourcePath = "ClientApp";
if (env.IsDevelopment())
{
spa.UseReactDevelopmentServer(npmScript: "start");
}
});
我的问题是:如何在没有控制器过滤器的情况下触发授权过程?
我已经针对asp.net核心文档创建了this inquiry,我知道这不是IdentityServer4问题,但也许您聪明的人可以对此事有所了解。
谢谢。
答案 0 :(得分:1)
用于SPA和任何其他静态中间件的universal solution将按以下步骤手动执行挑战:
app.Use(async (context, next) =>
{
if (!context.User.Identity.IsAuthenticated)
{
await context.ChallengeAsync();
}
else
{
await next();
}
});
此中间件应添加到Spa和Mvc之前的链中。