gpt4 book ai didi

c# - 在第一次加载之前通过授权服务器保护 SPA

转载 作者:IT王子 更新时间:2023-10-29 04:48:18 24 4
gpt4 key购买 nike

我在文章 Use the Angular project template with ASP.NET Core 中为 dotnet core 2.1 中的 Angular SPA 应用程序使用"new"项目模板.

但是这篇文章没有提到任何关于保护 SPA 本身的事情。我找到的所有信息都是关于保护 WEBAPI 的,但首先我对保护 SPA 很感兴趣。

这意味着:当我打开我的 SPA 时,例如https://localhost:44329/我希望立即被重定向到授权服务器,而不是单击将执行身份验证的某个按钮。

背景:

  • 我必须确保只有经过身份验证的用户才能查看 SPA。
  • 我想使用Authorization Code Grant 从我的授权服务器获取刷新 token 。
  • 我不能使用隐式授权,因为刷新 token 不能在浏览器上保持私有(private)

当前方法 是强制执行需要经过身份验证的用户的 MVC 策略。但这只能应用于 MVC Controller。这就是我添加 HomeController 来满足第一个请求的原因。

查看项目结构:

enter image description here

我的 Startup.cs:

public void ConfigureServices(IServiceCollection services)
{
services.AddAuthentication(options =>
{
options.DefaultAuthenticateScheme = CookieAuthenticationDefaults.AuthenticationScheme;
options.DefaultSignInScheme = CookieAuthenticationDefaults.AuthenticationScheme;
options.DefaultChallengeScheme = "CustomScheme";
})
.AddCookie()
.AddOAuth("CustomScheme", options =>
{
// Removed for brevity
});

services.AddMvc(config =>
{
// Require a authenticated user
var policy = new AuthorizationPolicyBuilder()
.RequireAuthenticatedUser()
.Build();
config.Filters.Add(new AuthorizeFilter(policy));
});

// In production, the Angular files will be served from this directory
services.AddSpaStaticFiles(configuration =>
{
configuration.RootPath = "ClientApp/dist";
});
}

// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseExceptionHandler("/Home/Error");
}

app.UseAuthentication();

app.UseStaticFiles();
app.UseSpaStaticFiles();

app.UseMvc(routes =>
{
routes.MapRoute(
name: "default",
template: "{controller=Home}/{action=Index}/{id?}");
});

app.UseSpa(spa =>
{
spa.Options.SourcePath = "ClientApp";

if (env.IsDevelopment())
{
spa.UseAngularCliServer(npmScript: "start");
}
});
}

当前行为:当我启动我的 SPA 时,由于 MVC 策略,我立即被重定向到我的授权服务器。身份验证成功后,我看到了家庭 Controller 的Index 方法,但看不到我的 SPA。

所以问题是在我从身份验证服务器重定向后我应该如何提供我的 SPA?

最佳答案

我有一些似乎有用的东西。

在我的研究中,我偶然发现了一个 this post建议使用中间件而不是授权属性。

现在,那个帖子 authService 中使用的方法似乎不适用于我的情况(不知道为什么,我将继续调查并在以后发布我发现的任何内容)。

所以我决定采用更简单的解决方案。这是我的配置

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

在这种情况下,oidc 在 Spa 应用程序之前启动并且流程正常运行。根本不需要 Controller 。

HTH

关于c# - 在第一次加载之前通过授权服务器保护 SPA,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50225898/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com