gpt4 book ai didi

c# - 一个 MVC Web 应用程序作为 API 和客户端

转载 作者:太空狗 更新时间:2023-10-29 17:44:15 24 4
gpt4 key购买 nike

我有一个 MVC 网络应用程序、一个 WPF 客户端和 Web API 服务器。我非常想将 API Controller 拉入 MVC 应用程序,并且只有一个应用程序/api。我这样做的主要原因是为应用程序用户和 API 客户端提供一个登录程序。

我想做的是注入(inject)一个 SignInManager<ApplicationUser进入Token Controller 及使用

var result = await _signInManager.PasswordSignInAsync(login.Username, login.Password, false, false);

使用与构建到 MVC 项目中相同的密码哈希器来验证用户名和密码。我不想复制任何那种类型的功能。我还希望通过此方式实现提供 JWT token 的登录,以便 WPF 应用程序访问 API 方面的内容,以及标准的登录 cookie,以便正常的 MVC 应用程序请求获得授权。

我应该如何以最少的代码重复来解决这个问题?

想法:也可以将一个 MVC 应用程序用作 REST 服务器。如果我的Login获取 JWT 的操作也会让我登录,例如与 _signInManager.PasswordSignInAsync ,我还应该获取允许我在内部访问 protected 操作的 cookie,并在外部使用包含 JWT 的授权 header 。

最佳答案

您可以考虑以下选项

选项 #1:将 MVC 应用程序中使用的逻辑移动到新的类库中,然后 API 项目可以引用该类库。这将允许您遵循 SRP 并在 MVC 和 API 应用程序中使用相同的逻辑。如果您想让 ASP.NET Identity 相关功能对 MVC 和 API 应用程序通用,请查看 Moving ASP.NET Identity Model to Class Library并按照提供的步骤操作。

选项#2:您可以将所有 Controller 和模型从 API 移动到 MVC 应用程序。然后,您可以将 API Controller 配置为使用 JWT 身份验证方案,并继续使用来自 MVC 应用程序 Controller 的 cookie 身份验证方案。如果您想遵循这种方法,您将需要配置您的身份验证中间件。例如,您的 Startup 类看起来像这样:

public void ConfigureServices(IServiceCollection services)
{
...
services.AddMvc();

services.AddAuthentication(o =>
{
o.DefaultChallengeScheme = CookieAuthenticationDefaults.AuthenticationScheme;
o.DefaultSignInScheme = CookieAuthenticationDefaults.AuthenticationScheme;
o.DefaultAuthenticateScheme = CookieAuthenticationDefaults.AuthenticationScheme;
}).AddCookie(options =>
{
options.AccessDeniedPath = new PathString("/Account/Login/");
options.LoginPath = new PathString("/Account/Login/");
}).AddJwtBearer(JwtBearerDefaults.AuthenticationScheme, options => {
options.TokenValidationParameters = new TokenValidationParameters
{
ValidateAudience = false,
ValidateIssuer = false,
ValidateIssuerSigningKey = true,
IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes("<put_your_secret_here>")),
ValidateLifetime = true,
ClockSkew = TimeSpan.FromMinutes(5)
};
});
}

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
...
app.UseAuthentication();
app.UseMvcWithDefaultRoute();
...
}

然后您可以定义 BaseApiController,它可用于设置到 API Controller 的路由并使用例如授权它们

[Authorize(AuthenticationSchemes = JwtBearerDefaults.AuthenticationScheme)]
[Route("api/[controller]")]
public abstract class BaseApiController {}

并让所有的 API Controller 继承这个基础 Controller 。您还可以使用更灵活的基于策略的授权。完成后,您将能够在 MVC 应用程序 Controller 中使用 cookie 进行身份验证,并在 API Controller 中使用 JWT token 进行身份验证。

选项 #3:您可以让 API 和 MVC 应用程序单独运行,并使用 IdentityServer 来实现 OAuth 协议(protocol)。将它添加到 MVC 应用程序,因为它与 ASP.NET Identity 集成得很好,并对其进行配置,以便继续使用 MVC 应用程序的 cookie 身份验证方案。然后配置 OAuth 流程之一以设置 WPF 应用程序和 API 之间的授权。 IdentityServer 有据可查,并为不同的流程提供示例 in their GitHub .这种方法的优点是,即使您考虑添加更多必须使用相同用户群的 API、SPA 或 MVC 应用程序,您将来也永远不会遇到此类问题。它还允许实现单点登录 (SSO),因此如果您需要另一个 MVC 应用程序,它可以轻松地将其集成到现有基础设施中。

关于c# - 一个 MVC Web 应用程序作为 API 和客户端,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49253975/

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