我有一个适用于.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是。
答案 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)>