Asp.net web api 当安全webapi用于非浏览器客户端时,ADFS使用什么协议

Asp.net web api 当安全webapi用于非浏览器客户端时,ADFS使用什么协议,asp.net-web-api,adfs,ws-federation,ws-trust,Asp.net Web Api,Adfs,Ws Federation,Ws Trust,我们的webapi端点用于基于浏览器的客户端(angular)和非基于浏览器的客户端(restsharp),webapi目前使用被动WS-Federation作为协议,ADFS作为STS进行保护。目前,我们对restsharp客户端使用了一种相当复杂的解决方法,因为被动WS-Federation对于非浏览器客户端来说并不理想,因此我们希望找到一种更好的方法来保护这些类型客户端的webapi端点,而无需更换ADF或添加额外的基础设施 我的理解是OAuth2“资源所有者密码凭据授予”(Grant_t

我们的webapi端点用于基于浏览器的客户端(angular)和非基于浏览器的客户端(restsharp),webapi目前使用被动WS-Federation作为协议,ADFS作为STS进行保护。目前,我们对restsharp客户端使用了一种相当复杂的解决方法,因为被动WS-Federation对于非浏览器客户端来说并不理想,因此我们希望找到一种更好的方法来保护这些类型客户端的webapi端点,而无需更换ADF或添加额外的基础设施

我的理解是OAuth2“资源所有者密码凭据授予”(Grant_type=Password)将很好地支持此场景,但不幸的是,ADFS目前不支持此场景

所以,我的问题是,有没有一种好方法可以使用ADFS支持的OAuth2流,即“授权代码授权流”(Grant_type=Authorization_Code),来支持非基于浏览器的客户端


如果这是不可能的,我可以使用WS-Trust和承载令牌来保护WebApi端点,而不必使用WCF吗?

事实证明,使用WS-Trust获得saml 2.0令牌和WebApi来使用它是可能的,只需要Thinktecture IdentityModel的一点帮助。以下内容不包括索赔转换,因此如果需要将索赔添加到主体中,则需要做更多的工作

webapi服务的owin启动需要使用Thinktecture.IdentityModel.owin中的以下内容:

app.UseSaml2BearerAuthentication(
            audience: new Uri(ConfigurationManager.AppSettings["FederatedSecurity.Realm"]),
            issuerThumbprint: ConfigurationManager.AppSettings["FederatedSecurity.Thumbprint"],
            issuerName: ConfigurationManager.AppSettings["FederatedSecurity.Authority"]);
用于客户端从ADFS请求saml 2.0令牌

private static SecurityToken RequestSecurityToken()
{
    var trustChannelFactory = new WSTrustChannelFactory(new UserNameWSTrustBinding(SecurityMode.TransportWithMessageCredential), new EndpointAddress(new Uri("https://yourAdfsServer/adfs/services/trust/13/usernamemixed"), new AddressHeader[0]))
    {
        TrustVersion = TrustVersion.WSTrust13,
        Credentials = { UserName = { UserName = @"u$ern@me", Password = "p@ssw0rd" } }
    };
     var requestSecurityToken = new RequestSecurityToken
    {
        RequestType = RequestTypes.Issue,
        KeyType = KeyTypes.Bearer,
        TokenType = TokenTypes.Saml2TokenProfile11,
        AppliesTo = new EndpointReference(_audience)
    };

    RequestSecurityTokenResponse response;
    var securityToken = trustChannelFactory.CreateChannel().Issue(requestSecurityToken, out response);

    return securityToken;
}
客户端调用服务(使用HttpClient,但RestSharp也可以)

private static void CallService(SecurityToken token)
{
    using (HttpClient client = new HttpClient())
    {
        client.SetBearerToken(Convert.ToBase64String(Encoding.UTF8.GetBytes(token.ToTokenXmlString())));
        var httpMessage = client.GetAsync(new Uri(_restEndpoint)).Result;
    }
}