想要向SPA的(dotnet)后端添加混合流身份验证

时间:2018-07-17 11:43:31

标签: c# asp.net-core react-redux single-page-application identityserver4

我还没有看到任何有关如何向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问题,但也许您聪明的人可以对此事有所了解。

谢谢。

1 个答案:

答案 0 :(得分:1)

用于SPA和任何其他静态中间件的universal solution将按以下步骤手动执行挑战:

app.Use(async (context, next) =>
        {
            if (!context.User.Identity.IsAuthenticated)
            {
                await context.ChallengeAsync();
            }
            else
            {
                await next();
            }
        });

此中间件应添加到Spa和Mvc之前的链中。