フロントエンドの自己ホスト型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トラフィックに関係なく同じ問題が発生します。
お寄せいただきありがとうございます!
これと私の独自の実装との唯一の違いは、ConfigureAuth(appBuilder)を宣言していることです。 Startup.csの設定方法の最初の行として –
これは問題であるようですが、提案に感謝します! – gooram
よかった!私はこれを答えとして追加するべきなので、この質問は閉じますか? –