如何在两个站点中共享OAuth承载身份验证

时间:2015-04-20 08:28:42

标签: oauth asp.net-mvc-5 asp.net-web-api2 owin

我想知道如何使用两个站点(Angularjs Tool + api)中的相同令牌(MVC Tool + api):

这是我项目的结构:

1。角度工具"主要网站"

我使用(2.授权API)进行授权,使用(3.Angular Tool Api)来检索数据。用户可以重定向到(4.MVC Tool + API)

2。授权API

我要google以验证用户,一旦用户有效,我就会生成将用于的OAuthBearerAuthentication(1..Angular Tool)

第3。 Angular Tool API

为了知道用户已被授权我使用owin,因此在每个请求中我都会在标题上找到附加在(2.Authoritzation API)上的令牌

4。 MVC工具+ API"第二站点"

另一个应用程序完全不同,但我想使用我在(1.Angular Tool)主站点上使用的相同令牌,这意味着来自主应用程序我将重定向到这里。

我想让2 Site (MVC和API控制器)使用相同的凭据,但我没有找到一种分享令牌的好方法。

1 个答案:

答案 0 :(得分:3)

要共享令牌,您需要使用两个应用程序都能理解的ISecureDataFormat<AuthenticationTicket>

使用默认TicketDataFormat以及IDataProtector的实施可以轻松实现这一目标,这些实施将能够在两个网站上以相同方式进行保护/取消保护。

OWIN(Katana)使用绑定到CurrentUser的DpapiDataProtector和&#39; host.AppName&#39;应用属性,除非您将两个网站设置为具有相同的名称和相同的用户,否则它将是唯一的,这是不理想的。

但实施自己的保护器很容易。这是一个使用LocalMachine范围保护数据的实现。

using System.Security.Cryptography;
using Microsoft.Owin.Security.DataProtection;

namespace MyApp.Owin
{
    public class LocalMachineDpapiDataProtector : IDataProtector
    {
        private readonly DpapiDataProtector protector;

        internal LocalMachineDpapiDataProtector(string appName, string[] purposes)
        {
            protector = new DpapiDataProtector(appName, "Microsoft.Owin.Security.DataProtection.IDataProtector", purposes)
            {
                Scope = DataProtectionScope.LocalMachine
            };
        }

        public byte[] Protect(byte[] userData)
        {
            return protector.Protect(userData);
        }

        public byte[] Unprotect(byte[] protectedData)
        {
            return protector.Unprotect(protectedData);
        }
    }
}

以下是如何设置身份验证服务器和中间件。

验证服务器:

var ticketDataFormat = 
    new TicketDataFormat(
        new LocalMachineDpapiDataProtector(
            "MyApp",
            new string[] { "OAuth" }));

app.UseOAuthAuthorizationServer(new OAuthAuthorizationServerOptions
{
    /*... your auth server settings*/
    AccessTokenFormat = ticketDataFormat
});

Auth中间件:

//note that we use a data format that is setup in the same manner
var ticketDataFormat = 
    new TicketDataFormat(
        new LocalMachineDpapiDataProtector(
            "MyApp",
            new string[] { "OAuth" }));

app.UseOAuthBearerAuthentication(new OAuthBearerAuthenticationOptions
{
    /*... your auth middleware settings*/
    AccessTokenFormat = ticketDataFormat
});

请注意,通过使用此LocalMachineDpapiDataProtector,您需要在同一台计算机上部署这两个站点。如果不是,则需要使用具有不同保护策略的IDataProtector。请参阅this implementation of AesDataProtector