Javascript ADAL JS在调用WebApi时未附加用户令牌
我正在使用Javascript ADAL JS在调用WebApi时未附加用户令牌,javascript,azure,asp.net-web-api,adal.js,Javascript,Azure,Asp.net Web Api,Adal.js,我正在使用ADAL JS根据Azure AD对用户进行身份验证。由于我是ADAL JS新手,我开始阅读以下文章,我发现这些文章内容非常丰富: 阅读了这些文章后,我的印象是,adaljs截取服务调用,如果服务url在AuthenticationContext配置中注册为端点之一,它会附加JWT令牌作为身份验证承载信息 然而,我发现我的情况并非如此。经过一番挖掘,我觉得只有在使用了adal angular计数器部分的情况下才有可能,而我目前没有使用计数器部分,因为我的web应用程序不是基于a
ADAL JS
根据Azure AD对用户进行身份验证。由于我是ADAL JS
新手,我开始阅读以下文章,我发现这些文章内容非常丰富:
adaljs
截取服务调用,如果服务url在AuthenticationContext
配置中注册为端点之一,它会附加JWT令牌作为身份验证承载信息
然而,我发现我的情况并非如此。经过一番挖掘,我觉得只有在使用了adal angular
计数器部分的情况下才有可能,而我目前没有使用计数器部分,因为我的web应用程序不是基于angular的
请让我知道我的理解是否正确。如果我需要明确地添加承载信息,同样可以这样做,但我更关心的是我是否缺少一些现成的功能
其他详细信息:我当前的配置如下所示:
private endpoints: any = {
"https://myhost/api": "here_goes_client_id"
}
...
private config: any;
private authContext: any = undefined;
....
this.config = {
tenant: "my_tenant.onmicrosoft.com",
clientId: "client_id_of_app_in_tenant_ad",
postLogoutRedirectUri: window.location.origin,
cacheLocation: "sessionStorage",
endpoints: this.endpoints
};
this.authContext = new (window["AuthenticationContext"])(this.config);
同样在服务器端(WebApi),身份验证配置(Startup.Auth)如下所示:
public void ConfigureOAuth(IAppBuilder app, HttpConfiguration httpConfig)
{
app.UseWindowsAzureActiveDirectoryBearerAuthentication(
new WindowsAzureActiveDirectoryBearerAuthenticationOptions
{
Tenant = "my_tenant.onmicrosoft.com",
TokenValidationParameters = new TokenValidationParameters
{
ValidAudience = "client_id_of_app_in_tenant_ad"
}
});
}
但是,请求.Headers中的授权
始终为空
更新:似乎自动更新代币也是如此;当与adal angular
一起使用时,令牌的更新可以通过在引擎盖下调用AuthenticationContext.acquireToken(资源,回调)
无缝工作。如果我错了,请纠正我
在阅读了这些文章之后,我的印象是ADAL JS截获了服务调用,如果服务url在AuthenticationContext配置中注册为端点之一,它会附加JWT令牌作为身份验证承载信息
只有当应用程序基于角度时,这才有效。正如你提到的,这种逻辑存在于adal angular
但是,如果您想坚持使用纯JS,您将无法获得自动的“获取访问令牌并将其附加到标头”支持。您可以使用acquireToken(resource,callback
api)来获取端点的令牌。但是您必须在向api发送请求的控制器中执行一些工作
这可能会让您有所了解:。此示例不使用角度
在阅读了这些文章之后,我的印象是ADAL JS截获了服务调用,如果服务url在AuthenticationContext配置中注册为端点之一,它会附加JWT令牌作为身份验证承载信息
只有当你的应用程序是基于angular的时候,这才有效。正如你提到的,这个逻辑存在于adal angular中
但是,如果您想坚持使用纯JS,您将无法获得自动的“获取访问令牌并将其附加到标头”支持。您可以使用acquireToken(资源,回调api)来获取端点的令牌。但是,您必须在向api发送请求的控制器中进行一些工作
这可能会给您一些想法:。此示例不使用angular。ADAL.JS与v2.0隐式流不兼容。我无法使其工作,因为我最近设置了我的项目,并且不认为项目向后兼容
这非常令人困惑,我花了很长时间才发现我混淆了版本,无法将ADAL.JS与v2.0一起使用。一旦我删除了它,事情就变得更加顺利了,只需执行几个XHR请求和一个弹出窗口,实际上不需要任何魔法
下面是v2的代码:
function testNoADAL() {
var clientId = "..guid..";
var redirectUrl = "..your one.."
var authServer = "https://login.microsoftonline.com/common/oauth2/v2.0/authorize?";
var responseType = "token";
var stateParam = Math.random() * new Date().getTime();
var authUrl = authServer +
"response_type=" + encodeURI(responseType) +
"&client_id=" + encodeURI(clientId) +
"&scope=" + encodeURI("https://outlook.office.com/Mail.ReadWrite") +
"&redirect_uri=" + encodeURI(redirectUrl) +
"&state=" + stateParam;
var popupWindow = window.open(authUrl, "Login", 'width=' + 300 + ', height=' + 600 + ', top=' + 10 + ', left=' + 10 + ',location=no,toolbar=yes');
if (popupWindow.focus) {
popupWindow.focus();
}
}
注意:重定向URL将出现在弹出窗口中,需要在其中包含代码才能传递位置哈希,例如:
window.opener.processMicrosoftAuthResultUrl(location.hash);window.close();
函数进程MicrosoftAuthResultUrl(哈希){
if(hash.indexOf(“#”)==0){
hash=hash.substr(1);
}
var obj=getUrlParameters(哈希);
if(对象错误){
if(obj.error==“无效的资源”){
errorDialog(“您的Office 365需要配置为允许访问Outlook邮件。”);
}否则{
错误对话框(“ADAL:+obj.错误描述”);
}
}否则{
if(对象访问令牌){
log(“ADAL获得了访问令牌!”);
var token=obj.access\u token;
变量url=”https://outlook.office.com/api/v2.0/me/MailFolders/Inbox/messages";
$.ajax({
键入:“获取”,
url:url,
标题:{
“授权”:“持票人”+代币,
},
}).完成(功能(数据){
log(“获取数据!”,数据);
var message=“您的最新电子邮件是:“+data.value[0].Subject+”来自“+data.value[0]。来自“+df_FmtDateTime”(新日期(data.value[0].ReceivedDateTime))上的.EmailAddress.Name+”;
警报对话框(消息);
}).fail(函数(){
console.error('获取待办事项列表数据时出错')
});
}
}
}
函数getUrlParameters(url){
//获取querystring并将其转换为对象
if(!url)返回{};
if(url.indexOf(“?”>-1){
url=url.split(“?”[1];
}
如果(url.indexOf(“#”)大于-1){
url=url.split(“#”)[0];
}
if(!url)返回{};
url=url.split(“&”)
var b={};
对于(变量i=0;i
ADAL.JS与v2.0隐式流不兼容。由于我最近设置了我的项目,因此无法使其工作,并且认为项目不向后兼容
这让我很困惑,我看了一眼
function processMicrosoftAuthResultUrl(hash) {
if (hash.indexOf("#") == 0) {
hash = hash.substr(1);
}
var obj = getUrlParameters(hash);
if (obj.error) {
if (obj.error == "invalid_resource") {
errorDialog("Your Office 365 needs to be configured to enable access to Outlook Mail.");
} else {
errorDialog("ADAL: " + obj.error_description);
}
} else {
if (obj.access_token) {
console.log("ADAL got access token!");
var token = obj.access_token;
var url = "https://outlook.office.com/api/v2.0/me/MailFolders/Inbox/messages";
$.ajax({
type: "GET",
url: url,
headers: {
'Authorization': 'Bearer ' + token,
},
}).done(function (data) {
console.log("got data!", data);
var message = "Your latest email is: " + data.value[0].Subject + " from " + data.value[0].From.EmailAddress.Name+ " on " + df_FmtDateTime(new Date(data.value[0].ReceivedDateTime));
alertDialog(message);
}).fail(function () {
console.error('Error getting todo list data')
});
}
}
}
function getUrlParameters(url) {
// get querystring and turn it into an object
if (!url) return {};
if (url.indexOf("?") > -1) {
url = url.split("?")[1];
}
if (url.indexOf("#") > -1) {
url = url.split("#")[0];
}
if (!url) return {};
url = url.split('&')
var b = {};
for (var i = 0; i < url.length; ++i) {
var p = url[i].split('=', 2);
if (p.length == 1) {
b[p[0]] = "";
} else {
b[decodeURIComponent(p[0])] = decodeURIComponent(p[1].replace(/\+/g, " "));
}
}
return b;
}