我有许多不同的Web应用程序,都在ASP.NET MVC中运行。这些ASP.NET MVC应用程序是.NET / Angular混合类,通常调用WebAPI API,这些API在IIS上自己独立的应用程序中运行。
所有应用程序都位于同一个域中,但位于不同的子域中。它们都运行在IIS的同一个实例上。
结构看起来像这样:
我需要做的是从一个单一来源(即登录应用程序)登录付款和新闻应用程序。然后登录应用程序调用登录API(显然不受限制)来发出令牌。
如果用户尝试在没有令牌的情况下访问付款或新闻应用程序,则应将其重定向到登录应用程序。如果没有有效令牌,Payments API和NewsAPI也应该无法访问,有效令牌应在登录发生的同时设置。
目前,登录API使用OWIN / OAuth成功发出了承载令牌 - 我不确定的部分是在子域中使用它。
我该怎么做呢?
答案 0 :(得分:0)
您可以使用内置Owin Authentication中间件的Asp.Net来实现此功能。请参考这个伟大的article,我相信您会想出符合您需求的解决方案。
在IAppBuilder上的单独类库中编写扩展方法,并在所有应用程序中共享该方法以进行令牌验证。请参阅以下示例(从文章中复制的代码):
public static void ConfigureOAuth(this IAppBuilder app)
{
var issuer = "http://jwtauthzsrv.azurewebsites.net";
var audience = "099153c2625149bc8ecb3e85e03f0022";
var secret = TextEncodings.Base64Url.Decode("IxrAjDoa2FqElO7IhrSrUJELhUckePEPVpaePlS_Xaw");
// Api controllers with an [Authorize] attribute will be validated with JWT
app.UseJwtBearerAuthentication(
new JwtBearerAuthenticationOptions
{
AuthenticationMode = AuthenticationMode.Active,
AllowedAudiences = new[] { audience },
IssuerSecurityTokenProviders = new IIssuerSecurityTokenProvider[]
{
new SymmetricKeyIssuerSecurityTokenProvider(issuer, secret)
}
});
}
发行人将使用相同的信息(秘密和受众)发出令牌。由于验证逻辑在子域中是相同的,因此令牌在所有子域上都是有效的。
如果您有任何疑问,请与我们联系。
谢谢你, 索玛。