几天以来,我一直在努力将Azure AD身份验证用于我的WebAPI服务。我试图在github上发布Mat Velloso的例子 - AngularJSCORS。我有两个独立的网站,我们称它们为Client(ASP.NET MVC,adal.js和angular)和Server(ASP.NET WebAPI)。它们都托管在Azure上。我创建了两个相应的AD默认目录应用程序,让我们称它们为ADClient,ADServer。 OWIN配置:
[assembly: OwinStartup(typeof(CorsEnabled3.Startup))]
namespace CorsEnabled3
{
public partial class Startup
{
public void ConfigureAuth(IAppBuilder app)
{
app.UseWindowsAzureActiveDirectoryBearerAuthentication(
new WindowsAzureActiveDirectoryBearerAuthenticationOptions
{
Audience = ConfigurationManager.AppSettings["ida:Audience"],
Tenant = ConfigurationManager.AppSettings["ida:Tenant"]
});
}
public void Configuration(IAppBuilder app)
{
ConfigureAuth(app);
var config = new HttpConfiguration();
config.MapHttpAttributeRoutes();
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
var cors = new EnableCorsAttribute("https://<<ClientURL>", "*", "*");
config.EnableCors(cors);
app.UseWebApi(config);
}
}
}
我已经从Global移动了WebAPI配置,因为它已在堆栈中被建议,但遗憾的是,仍然没有结果。
控制器:
[EnableCors("*", "*", "*", SupportsCredentials = false)]
[Authorize]
public class ValuesController : ApiController {
public IEnumerable<string> Get()
{
//This example returns all claims found in the request
string[] result = (from Claim claim in ClaimsPrincipal.Current.Claims
select claim.Type + ":" + claim.Value).ToArray();
return result;
}
}
相关(我猜)webconfig的一部分
<configuration>
<appSettings>
<add key="ida:Tenant" value="marekpiotrowskilive.onmicrosoft.com" />
<add key="ida:Audience" value="<<Audience>>" />
<add key="ida:ClientID" value="<<ClientID>>" />
</appSettings>
至于受众 - 我已经尝试了所有可能的组合 - ADServer应用程序ClientID,ADClient ClientID,[Tenant] / [ADServerName],对于ClientID也是如此(尽管就我而言,它并未在服务器端使用),没有成功。
现在,对于客户端Web应用程序--ADAL.js配置:
var endpoints = {
"[BaseServerApplicationURL]": "[ADServer ClientID]"
};
adalProvider.init(
{
tenant: 'marekpiotrowskilive.onmicrosoft.com',
clientId: '[ADClient ClientID]',
endpoints:endpoints
},
$httpProvider
);
现在,对于AD应用程序配置 - 我已经编辑了服务器的清单,所以看起来如下(编辑过的部分):
"oauth2AllowImplicitFlow": true,
"oauth2Permissions": [
{
"adminConsentDescription": "Allow the application to access WebApiAzureAD on behalf of the signed-in user.",
"adminConsentDisplayName": "Access WebApiAzureAD",
"id": "[ADClient ClientID]",
"isEnabled": true,
"type": "User",
"userConsentDescription": "Allow the application to access WebApiAzureAD on your behalf.",
"userConsentDisplayName": "Access WebApiAzureAD",
"value": "user_impersonation"
}
],
我尝试添加“origin”:“Application”属性,就像在Mat的例子中一样,但是在上传已编辑的清单并再次下载之后,它会自动消失,所以我猜它正被一些MS解析器修剪。
我还允许在ADClient应用程序清单中隐式流。 权限也已设置(WepAPIAzureAD是ADServer应用程序): ADClient permissions
现在,当从Client webapplication通过ADAL调用Values控制器时,我首先收到access_token(我可以在解析的JWT中看到我的用户配置文件),OPTIONS请求返回200,但最终的GET请求返回401。 登录请求(GET):
https://login.microsoftonline.com/marekpiotrowskilive.onmicrosoft.com/oauth2/authorize?
response_type=token&
client_id=[ADClient ClientID]&
resource=[ADServer ClientID]&
redirect_uri=[Client Webapplication URL]&
state=8d4ffa7e-7636-4feb-9574-05830eef9b83"%"7Cfe58f01e-d8f1-4791-8c7d-bce0897fbccd&
client-request-id=8e31eafe-2a8a-46a6-b41f-4510f7df1966&
x-client-SKU=Js&x-client-Ver=1.0.2&
prompt=none&
login_hint=marek_piotrowski"%"40live.com&
domain_hint=live.com&
nonce=715351de-1177-4b9b-94fc-89cce310026b
发送给价值控制者的请求: 1. OPTIONS请求 - 返回200 OK 2. GET请求:
GET /api/values HTTP/1.1
Host: notemplatesso.azurewebsites.net
Connection: keep-alive
Accept: application/json, text/plain, */*
Origin: https://itdevclient.azurewebsites.net
User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.93 Safari/537.36 OPR/32.0.1948.69
Authorization: Bearer eyJ0eXAiOiJKV1QiLCJ...7HDSY7RwkUHW_ag
Referer: https://itdevclient.azurewebsites.net/
Accept-Encoding: gzip, deflate, lzma, sdch
Accept-Language: en-US,en;q=0.8
返回401
任何帮助它的工作将不胜感激。我真的没有任何想法,我还能做些什么。
最后的说明:
更新
好的家伙,对不起打扰你,在这里找到了一个完整的指南
https://github.com/Azure-Samples/active-directory-angularjs-singlepageapp-dotnet-webapi
我必须在之前的解决方案中错放了ClientID和URL。这一切都在上面的教程中逐步解释,所以我最终可以成功运行它。谢谢