使用OAuth令牌从单点登录源授权不同的ASP.NET MVC应用程序

时间:2016-05-20 07:02:02

标签: asp.net oauth

我有许多不同的Web应用程序,都在ASP.NET MVC中运行。这些ASP.NET MVC应用程序是.NET / Angular混合类,通常调用WebAPI API,这些API在IIS上自己独立的应用程序中运行。

所有应用程序都位于同一个域中,但位于不同的子域中。它们都运行在IIS的同一个实例上。

结构看起来像这样:

  • 付款申请表( MVC,payments.myapp.com
  • 新闻申请( MVC,news.myapp.com
  • 付款API( WebAPI,paymentsapi.myapp.com
  • 新闻API( WebAPI,newsapi.myapp.com
  • 登录应用程序( MVC,login.myapp.com
  • 登录API( WebAPI,loginapi.myapp.com

我需要做的是从一个单一来源(即登录应用程序)登录付款和新闻应用程序。然后登录应用程序调用登录API(显然不受限制)来发出令牌。

如果用户尝试在没有令牌的情况下访问付款或新闻应用程序,则应将其重定向到登录应用程序。如果没有有效令牌,Payments API和NewsAPI也应该无法访问,有效令牌应在登录发生的同时设置。

目前,登录API使用OWIN / OAuth成功发出了承载令牌 - 我不确定的部分是在子域中使用它。

我该怎么做呢?

1 个答案:

答案 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)
                    }
                });

        }

发行人将使用相同的信息(秘密和受众)发出令牌。由于验证逻辑在子域中是相同的,因此令牌在所有子域上都是有效的。

如果您有任何疑问,请与我们联系。

谢谢你, 索玛。