2017-03-10 11 views
0

フロントエンドの自己ホスト型Webアプリケーションがあり、Azure Active Directory経由でユーザーの認証を開始する必要があります。401 AngularJS/ADAL.jsクライアントからWebApIにアクセスする際に不正なエラーが発生する

私はSinglePageAppサンプルをダウンロードしました。これを設定して正常に実行しました。 https://github.com/Azure-Samples/active-directory-angularjs-singlepageapp-dotnet-webapi

私のアプリケーションに必要な変更を適用すると、ユーザーをAzureログイン画面にリダイレクトし、adal.js/adal_angular.jsを使用してuserProfileを正常に取得できます。 APIを呼び出すたびに401の不正なエラーが発生しますが、Fiddlerを使用すると、各呼び出しでベアラトークンがHTTPヘッダーに追加されていることがわかります。ここで

は私AdalAngularセットアップです:ここでは

.config(["$httpProvider", "adalAuthenticationServiceProvider", ($httpProvider, adalProvider) => { 
      adalProvider.init(
      { 
       instance: "https://login.microsoftonline.com/", 
       tenant: "<snip>.onmicrosoft.com", 
       clientId: "<snip>", 
       extraQueryParameter: "nux=1", 
       cacheLocation: "localStorage" // enable this for IE, as sessionStorage does not work for localhost. 
      }, 
      $httpProvider); 

は私startup.csコードです:

ActiveDirectoryTenantとActiveDirectoryApplicationIdは私のApp.configファイルであり、私の角度に設定されているものと一致し
public void Configuration(IAppBuilder appBuilder) 
    { 

     ConfigureWebApi(appBuilder); 
     ConfigureAuth(appBuilder); 
     ConfigureFileSystem(appBuilder); 
     appBuilder.UseCors(Microsoft.Owin.Cors.CorsOptions.AllowAll); 
    } 

private void ConfigureWebApi(IAppBuilder appBuilder) 
    { 
     // Configure Web API for self-host. 
     HttpConfiguration config = new HttpConfiguration(); 
     config.MapHttpAttributeRoutes(); 
     config.Routes.MapHttpRoute(
      name: "DefaultApi", 
      routeTemplate: "api/{controller}/{id}", 
      defaults: new { id = RouteParameter.Optional } 
     ); 

     appBuilder.UseWebApi(config); 
    } 

    private void ConfigureAuth(IAppBuilder app) 
    { 
     app.UseWindowsAzureActiveDirectoryBearerAuthentication(
      new WindowsAzureActiveDirectoryBearerAuthenticationOptions 
      { 
       Tenant = ConfigurationManager.AppSettings["ActiveDirectoryTenant"], 
       Audience = ConfigurationManager.AppSettings["ActiveDirectoryApplicationId"] 
      }); 
    } 

    private void ConfigureFileSystem(IAppBuilder appBuilder) 
    { 

     //Set the Welcome page to test if Owin is hosted properly 
     appBuilder.UseWelcomePage("/welcome.html"); 
     appBuilder.UseErrorPage(new Microsoft.Owin.Diagnostics.ErrorPageOptions() { ShowExceptionDetails = true }); 
     var physicalFileSystem = new PhysicalFileSystem(@".\wwwroot"); 
     if (ConfigurationManager.AppSettings.AllKeys.Contains("ContentPath")) 
     { 
      var path = ConfigurationManager.AppSettings["ContentPath"]; 
      physicalFileSystem = new PhysicalFileSystem(path); 
     } 
     FileServerOptions fileOptions = new FileServerOptions(); 

     fileOptions.EnableDefaultFiles = true; 
     fileOptions.RequestPath = PathString.Empty; 
     fileOptions.FileSystem = physicalFileSystem; 
     fileOptions.DefaultFilesOptions.DefaultFileNames = new[] { "index.html" }; 
     fileOptions.StaticFileOptions.FileSystem = fileOptions.FileSystem = physicalFileSystem; 
     fileOptions.StaticFileOptions.ServeUnknownFileTypes = true; 
     appBuilder.UseFileServer(fileOptions); 
    } 

adalProvider.initコードは正確です。

最後に、私のApiControllerは次のようになります。

[Authorize] 
[RoutePrefix("api/connection")] 
public class ServerConnectionController : ApiController 
{ 
    [Route("all")] 
    [HttpGet] 
    public HttpResponseMessage GetAllConnections() 
    { 
     HttpResponseMessage response; 
     try 
     { 
      string owner = ClaimsPrincipal.Current.FindFirst(ClaimTypes.NameIdentifier).Value; 
      var connections = _iDataAccess.GetAllConnections().ToList(); 
      response = Request.CreateResponse(HttpStatusCode.OK, connections); 
     } 
     catch (Exception ex) 
     { 
      response = GetExceptionResponseMessage(ex); 
     } 

     return response; 
    } 
} 

としては、フィドラーで撮影したHTTPリクエストヘッダには[OK]を見て、私のADAL.js userInfo.profile上AUDプロパティが正しいAPPIDで述べました。

何が不足している可能性がありますか? これはネイティブWebベースのアプリケーションではなく、自己ホスト型であることに注意してください。つまり、WebサービスはIISではなくWindowsサービスとしてlocalhost上で実行されています。

HTTPSを使用するようにサイトを設定しましたが、HTTPまたはHTTPSトラフィックに関係なく同じ問題が発生します。

お寄せいただきありがとうございます!

+0

これと私の独自の実装との唯一の違いは、ConfigureAuth(appBuilder)を宣言していることです。 Startup.csの設定方法の最初の行として –

+0

これは問題であるようですが、提案に感謝します! – gooram

+0

よかった!私はこれを答えとして追加するべきなので、この質問は閉じますか? –

答えて

0

ConfigureAuth(appBuilder);をStartup.cs設定メソッドの最初の行として宣言する必要があります。最初に宣言する必要がある理由については、hereという良い説明があります。

関連する問題