我想知道如何使用两个站点(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控制器)使用相同的凭据,但我没有找到一种分享令牌的好方法。
答案 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
。