我有2个ASP.Net应用程序:App1和App2。这两个应用程序都是使用WIF和相同ADFS服务器对用户进行身份验证的标准Web应用程序,但App2也公开了一些WebAPI服务。
当用户转到App1时,App1调用App2上的服务,我需要以某种方式使用用户的令牌调用App2服务。
如果用户自己在App2上调用该服务,他们将通过相同的ADFS身份验证,一切都会正常工作,但它是在App2上调用服务的App1,而不是用户。
有关如何做到这一点的任何想法?
谢谢!
答案 0 :(得分:4)
您可以使用WS-Trust(ActAs)获取委托令牌:
http://weblogs.asp.net/cibrax/archive/2010/01/04/actas-in-ws-trust-1-4.aspx
或者你可以做穷人的代表团:
或者您可以使用Thinktecture IdentityServer Adfs Bridge:
答案 1 :(得分:2)
我处于同样的情况并且完成了所有工作。以下是(我使用的是Thinktecture Identity Server):
我必须设置一个我的网络应用程序使用的委托帐户(webappaccount
)通过转到身份委派 - >添加领域来委托我的服务所在的领域身份服务器,在我的Web应用程序中,我不得不对我的STS进行服务调用,提供引导令牌以接收新的安全令牌,然后我可以使用该令牌对我的服务进行身份验证。
在我设置的网络应用配置中:
<system.identityModel>
<identityConfiguration saveBootstrapContext="true">
在我的网络应用中,访问我服务的代码如下:
BootstrapContext context = ClaimsPrincipal.Current.Identities.First().BootstrapContext as BootstrapContext;
var factory = new WSTrustChannelFactory(
new UserNameWSTrustBinding(SecurityMode.TransportWithMessageCredential), _trustUrl);
factory.TrustVersion = TrustVersion.WSTrust13;
factory.Credentials.UserName.UserName = "webappaccount";
factory.Credentials.UserName.Password = "P@ssword";
var rst = new RequestSecurityToken
{
RequestType = RequestTypes.Issue,
KeyType = KeyTypes.Bearer,
AppliesTo = new EndpointReference(_realm),
ActAs = new SecurityTokenElement(context.SecurityToken)
};
var token = factory.CreateChannel().Issue(rst) as GenericXmlSecurityToken;
var client = new HttpClient
{
BaseAddress = _baseAddress
};
client.SetToken("SAML", token.TokenXml.OuterXml);
var response = client.GetAsync("api/values").Result;
我的REST服务不需要任何更改。