ASP.NET WebAPI,CORS和Azure AD - 此请求已拒绝授权

时间:2015-10-10 13:11:42

标签: azure asp.net-web-api oauth-2.0 cors azure-active-directory

几天以来,我一直在努力将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

任何帮助它的工作将不胜感激。我真的没有任何想法,我还能做些什么。

最后的说明:

  • 您可以假设我已经尝试了所有可能的组合,只要您看到[ADServer ClientID]和[ADClient ClientID]
  • 在Azure Managment Portal中检查OAuth端点后,我发现授权URL略有不同(login.microsoftonline.com/4f1e1f16-b5aa-4bca-b118-70728184c2b2/oauth2/授权),所以我在adal.js配置中更改了正确的字段,以便登录URL匹配它。仍然没有成功 - 令牌似乎无效,或者OWIN层有问题。
  • 更新
    好的家伙,对不起打扰你,在这里找到了一个完整的指南 https://github.com/Azure-Samples/active-directory-angularjs-singlepageapp-dotnet-webapi 我必须在之前的解决方案中错放了ClientID和URL。这一切都在上面的教程中逐步解释,所以我最终可以成功运行它。谢谢

    0 个答案:

    没有答案