Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/265.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 要将混合流身份验证添加到SPA的(dotnet)后端吗_C#_Asp.net Core_React Redux_Single Page Application_Identityserver4 - Fatal编程技术网

C# 要将混合流身份验证添加到SPA的(dotnet)后端吗

C# 要将混合流身份验证添加到SPA的(dotnet)后端吗,c#,asp.net-core,react-redux,single-page-application,identityserver4,C#,Asp.net Core,React Redux,Single Page Application,Identityserver4,我还没有看到任何关于如何向SPA应用程序添加身份验证的文档/示例,例如在ASP.NET Core 2.1上使用react redux模板时(该模板在后台使用常用的create react应用程序) 我只是想澄清一下,我不是在问如何在React客户端应用程序中添加隐式流身份验证,我确实知道如何做到这一点,但这对我们的客户来说不够安全。我希望后端(ASP.NET核心)使用混合流通过OIDC身份提供程序处理身份验证 我将在服务管道中添加以下内容: services.AddAuthentication(

我还没有看到任何关于如何向SPA应用程序添加身份验证的文档/示例,例如在ASP.NET Core 2.1上使用react redux模板时(该模板在后台使用常用的create react应用程序)

我只是想澄清一下,我不是在问如何在React客户端应用程序中添加隐式流身份验证,我确实知道如何做到这一点,但这对我们的客户来说不够安全。我希望后端(ASP.NET核心)使用混合流通过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;
}
然后是相应的
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文件夹加载作为我的应用程序的入口点:

app.UseSpa(spa =>
{
    spa.Options.SourcePath = "ClientApp";
    if (env.IsDevelopment())
    {
        spa.UseReactDevelopmentServer(npmScript: "start");
    }
});
我的问题是:在没有控制器过滤器的情况下,如何触发授权过程

我已经针对asp.net核心文档进行了创建,我知道这不是IdentityServer4问题,但也许你们这些聪明人可以对此有所了解

提前感谢。

SPA和任何其他静态中间件的任务是手动执行质询,如下所示:

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

这个中间件应该在Spa和Mvc之前添加到链中。

在我看来,混合流根本不适合Spa。并证实了这一点,但是。。。看到新的东西会很有趣…:)@不,我完全明白,但我要求的是对后端服务器执行混合流,然后在用户成功登录并拥有有效cookie后加载SPA。之后可能会对令牌使用静默刷新。SPA的想法是允许浏览器中的应用程序完全独立工作,只在需要时调用API,这意味着应用程序中根本没有服务器端。混合流的思想是将浏览器和服务器分开,使用公共clientId。但是为什么不将SPA和API分离到不同的oidc客户机中,允许API使用后台通道(据我所知,这是客户的要求)。这是完全正确的。事实上,API已经是一个单独的ApiResource(oidc客户端),并根据身份提供程序服务器验证从SPA传递的访问/引用令牌。那么多是与其他网络应用一起工作的!所以,您实际需要的是使用Authorize属性保护一些静态文件(您的spa源)?这不是一个与oidc相关的问题。在这方面,我的第一个愚蠢的想法不是使用静态,而是使用MVC索引视图加载应用程序并执行身份验证预检查…这是完美的。我在森林深处,没有看到简单的解决办法。现在我可以使用混合的OIDC流,让asp.net中间件来处理这个问题。非常感谢。我刚刚开始使用.net core 3.1 react模板,使用方式与您建议的相同。效果很好。我的问题是,如何在React应用程序中获取访问令牌?我需要它向我的api服务发送请求?@killjoy我不是react专家,但这一定是你需要的