将ADFS令牌传递给服务

3
我有两个ASP.Net应用程序:App1和App2。这两个应用程序都是标准的Web应用程序,使用相同的ADFS服务器使用WIF来验证用户,但是App2还公开了一些WebAPI服务。
当用户进入App1时,App1调用App2上的一个服务,并且我需要以某种方式使用用户的令牌调用App2服务。
如果用户自己在调用App2上的服务,则他们将通过相同的ADFS身份验证,并且一切都将正常工作,但是调用App2上的服务的是App1,而不是用户。
您对如何完成此操作有什么想法吗?
谢谢!
2个回答

4

我认为这可能是我的答案:http://technet.microsoft.com/en-us/library/adfs2-identity-delegation-step-by-step-guide(v=ws.10).aspx,但在您的帮助下,我几乎直接找到了它。谢谢! - Mark A Johnson
我已经苦苦思索了一段时间,认为自己有答案,但实际上并没有。我在设置IdentityServer时遇到了很多麻烦,而所有的示例都使用WCF和CreateChannelActingAs,而不是WebAPI。是否有: a)直接使用引导令牌通过代码直接请求令牌的方法? b)序列化整个令牌以在我的WebClient请求标头中使用? - Mark A Johnson
马克,你找到解决方案了吗?我也遇到了同样的问题。谢谢。 - cmedine

2
我曾经处于完全相同的情况,并且已经成功解决了问题。以下是我的方法(我使用Thinktecture Identity Server):
我需要设置一个委派账户,我的Web应用程序使用(webappaccount)来委派到我的服务所在的领域,通过在身份服务器中进入Identity Delegation->Add Realm,并在我的Web应用程序中,我需要调用我的STS提供引导令牌以接收新的安全令牌,然后可以使用该令牌进行身份验证。
在Web应用程序配置中,我设置了:
<system.identityModel>
    <identityConfiguration saveBootstrapContext="true">

在我的 Web 应用程序中,访问我的服务的代码如下:

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服务不需要任何更改。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接