.NET 3.5中的AuthenticationContext.AcquireToken等效项

时间:2017-02-07 09:18:54

标签: c# security wif bearer-token

我有一个适用于.Net Framework 4.5的代码,但我需要在.Net 3.5中使用等效代码。我的问题是几乎所有我的谷歌搜索都会导致使用新WIF的解决方案或关于旧WIF 3.5的一般信息。

代码如下所示:

using Microsoft.IdentityModel.Clients.ActiveDirectory;

namespace x 
{
    class y 
    {
        public string GetAuthenticationHeader(Ax7Config config)
        {
            var user = new UserCredential(config.username, config.password);
            return new AuthenticationContext(config.tenant)
                .AcquireToken(config.resource, config.clientAppId, user)
                .CreateAuthorizationHeader();
        }
    }
}

PS: 生成的dll作为插件导入到3.5 .net框架上运行的应用程序中,无法重新编译到最新的框架。所以这不会起作用。

PS: 对于它的价值,我知道.CreateAuthorizationHeader()只返回"Bearer " + AccessToken。所以这不是问题所在。获取AccessToken是。

2 个答案:

答案 0 :(得分:0)

最后,AcquireToken只向您的STS发送https请求。您可以自己轻松地模拟它。请求是这样的(对于AAD):

POST https://login.microsoftonline.com/your-tenant-id/oauth2/token HTTP/1.1
Accept: application/json
x-client-Ver: 3.13.5.907
x-client-CPU: x64
x-client-OS: Microsoft Windows NT 6.2.9200.0
x-ms-PKeyAuth: 1.0
client-request-id: 10a9f6d3-1247-493e-874f-fab04e1427c7
return-client-request-id: true
Content-Type: application/x-www-form-urlencoded
Host: login.microsoftonline.com
Content-Length: 183
Expect: 100-continue
Connection: Keep-Alive

resource=your-resource-guid&client_id=your-lcient-guid&client_secret=***** CREDENTIALS REMOVED HERE *****&grant_type=client_credentials

使用WebClient(p.e; How to fill forms and submit with Webclient in C#)很容易。服务器的响应通常是这样的:

HTTP/1.1 200 OK
Cache-Control: no-cache, no-store
...
Content-Type: application/json; charset=utf-8
Expires: -1
Server: Microsoft-IIS/8.5
Strict-Transport-Security: max-age=31536000; includeSubDomains
X-Content-Type-Options: nosniff
client-request-id: 10a9f6d3-1247-493e-874f-fab04e1427c7
x-ms-request-id: bla-bla
…
X-Powered-By: ASP.NET
Date: Thu, 23 Feb 2017 08:35:26 GMT
Content-Length: 1278

{"token_type":"Bearer","expires_in":"3599","ext_expires_in":"10800","expires_on":"1487842528","not_before":"1487838628","resource":"your-resource-id","access_token":"your-access-token"}

结果是json,令牌位于“access_token”字段中。你可以使用像Fiddler这样的工具来正确地获取你的请求,但这基本上就是它的作用。 (您可能会使用Newtonsoft正确地反序列化json。)

不要让我说这是ADAL为你做的一切。 ADAL还可以执行诸如令牌缓存之类的操作,因此您不必在每次调用时请求令牌,并且它会自动处理到期等。但是使用一些代码,您也可以自己滚动它。 希望这会有所帮助。

答案 1 :(得分:0)

下面是我用来获取令牌的代码。结果将在json中,您必须将其反序列化才能读取“ access_token”字段。

let target = someObjectWithDoThing
let selectorCallResult = target.value(forKey: "doThing")

let intResult = selectorCallResult as? Int //Optional<Int(1)>
let boolResult = selectorCallResult as? Bool //Optional<Bool(true)>