簡體   English   中英

一個MVC Web應用程序作為API和客戶端

[英]One MVC web application as API and client

我有一個MVC Web應用程序,一個WPF客戶端和Web API服務器。 我非常想將API控制器拉入MVC應用程序,並且只有一個app / api。 我的主要原因是為應用程序用戶和API客戶端提供一個登錄過程。

我想要做的是將SignInManager<ApplicationUser注入Token控制器並使用

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

使用與構建到MVC項目中相同的密碼hasher來驗證用戶名和密碼。 我不想復制任何類型的功能。 我也希望通過這種方式實現一個登錄,為WPF應用程序提供JWT令牌,以訪問API方面的內容,以及標准的登錄cookie,以便正常的MVC應用程序請求獲得授權。

我應該如何以最少的代碼重復來解決這個問題?

IDEA:使用一個MVC應用程序作為REST服務器。 如果我獲得JWT的Login操作也簽了我,例如使用_signInManager.PasswordSignInAsync ,我還應該獲得允許我在內部訪問受保護動作的cookie,並在外部使用包含JWT的授權頭。

您可以考慮以下選項

選項#1 :將MVC應用程序中使用的邏輯移動到新的類庫,然后可以通過API項目引用它。 這將允許您遵循SRP並在MVC和API應用程序中使用相同的邏輯。 如果您想使ASP.NET身份相關的功能在MVC和API應用程序中很常見,請查看將ASP.NET身份模型移動到類庫並按照提供的步驟操作。

選項#2:您可以將所有控制器和模型從API移動到MVC應用程序。 您可以配置然后API控制器使用JWT身份驗證方案並繼續使用cookie身份驗證方案fr MVC apps的控制器。 如果要使用此方法,則需要配置身份驗證中間件。 例如,您的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控制器的路由並使用例如授權它們

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

並使所有API控制器繼承此基本控制器。 您還可以使用更靈活的基於策略的授權。 完成后,您將能夠使用MVC應用程序控制器中的cookie以及API控制器中的JWT令牌進行身份驗證。

選項#3 :您可以讓API和MVC應用程序單獨運行,並使用IdentityServer實現OAuth協議。 將它添加到MVC應用程序,因為它與ASP.NET身份很好地集成並配置它,以便繼續使用MVC應用程序的cookie身份驗證方案。 然后配置其中一個OAuth流程以在WPF應用程序和API之間設置授權。 IdentityServer有詳細記錄,並為其GitHub中的不同流提供樣本。 這種方法的優點是,即使您考慮添加更多必須使用相同用戶群的API,SPA或MVC應用程序,您將來也不會遇到此類問題。 此外,它還允許實現單點登錄(SSO),因此如果您需要其他MVC應用程序,則可以輕松地將其集成到現有基礎架構中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM