2017-10-05 5 views
1

私は認証に使用しているAzure Mobileサービスを持っています。 Timespanはそうトークンの有効期限が切れていないnullに設定されている401 Azureモバイルサービスにリクエストすると権限がない

JwtSecurityToken token = AppServiceLoginHandler.CreateToken(claims, signingKey, audience, issuer, null); 
return Ok(new LoginResult() 
{ 
    AuthenticationToken = token.RawData, 
    User = signinedInUser, 
    StatusCode = System.Net.HttpStatusCode.OK 
}); 

注意:私は、一度検証し、以下の情報を返すカスタム認証プロバイダーを持っています。

その後、Authorize()属性で保護されたコントローラを持つ私のAMSに次の要求を行います。しかし、私のブレークポイントがヒットする前に、これらはすべて401 Unauthorizedの応答で失敗しています。

私は、これが起こっているAzureのログから見ることができる

2017-10-05T12:18:54 PID [5524]情報要求、METHOD = POST、 のURL = https://mywebsite.azurewebsites.net/api/userinfo/update、 メッセージ= 'https://mywebsite.azurewebsites.net/api/userinfo/update'

2017-10-05T12:18:54 PID [5524]情報メッセージ= 'のUserInfo' オペレーション= DefaultHttpControllerSelector.SelectController

2017-10-05T12:18:54 PID [5524]情報 メッセージ= 'MyAMS.Controllers.UserInfoController' オペレーション= DefaultHttpControllerActivator.Create

2017-10-05T12:18:54 PID [5524]情報 メッセージ= 'MyAMS.Controllers.UserInfoController' オペレーション= HttpControllerDescriptor .CreateController

2017-10-05T12:18:54 PID [5524]情報メッセージ= '選択されたアクション '更新(ユーザcpUser)''、 オペレーション= ApiControllerActionSelector.SelectAction

2017-10-05T12 :18:54 PID [5524]情報メッセージ= '同じものを使用する 'JsonMediaTypeFormatter' フォーマッタ ' オペレーション= JsonMediaTypeFormatter.GetPerRequestFormatterInstance

2017-10-05T12:18:54 PID [5524]情報メッセージは= '選択さ フォーマッタ=' JsonMediaTypeFormatter'、コンテンツ・タイプ= "アプリケーション/ JSON ; のcharset = UTF-8 ''、オペレーション= DefaultContentNegotiator.Negotiate

2017-10-05T12:18:54 PID [5524]情報 オペレーション= AuthorizeAttribute.OnAuthorizationAsync、ステータス= 401 (不正)

2017-10-05T12:18:54 PID [5524]情報 操作= UserInfoController。ExecuteAsync、ステータス= 401(不正)

2017-10-05T12:18:54 PID [5524]情報応答、ステータス= 401 (不正)、メソッド= POST、 のURL = https://mywebsite.azurewebsites.net/api/userinfo/update、 メッセージ= 'コンテンツ-type = 'application/json;文字セット= UTF-8' 、 コンテンツ長=不明」

あなたは承認属性が401応答を設定していることがわかります。

2017-10-05T12:18:54 PID [クライアントで5524]インフォメーション オペレーション= AuthorizeAttribute.OnAuthorizationAsync、ステータス= 401 (無許可)

、私は、ユーザーIDと認証トークンの両方を取り込む:

this.client = new MobileServiceClient("https://mywebsite.azurewebsites.net"); 
var user = UserProfileService.GetCurrentSignedInUser(); 
client.CurrentUser = new MobileServiceUser(user.UserId.ToString()) 
{ 
    MobileServiceAuthenticationToken = user.AuthToken 
}; 

コードをステップ実行すると、UserIDがユーザーのものと一致し、AuthTokenがログインメソッドで返された同じAutTokenであることが確認されました。

Azure Mobileサービスへの認証されたリクエストを有効にするために設定/実行する必要があるものはありますか?

EDIT

おかげで、私は無効になりますので、Azureの内の他のすべての認証プロバイダを持っているが、これは問題を解決していません。 また、ローカルでコードをデバッグしましたが、Azureにデプロイされたときにのみ、ローカルホスト上で実行されている問題は発生しません。

答えて

2

あなたのコードによれば、あなたのazureモバイルアプリのカスタム認証を使用しています。アドリアンホールの書籍についてCustom Authentication

あなたのApp Serviceで認証/認可を有効にする必要があります。 要求が認証されていない場合に実行する処理要求を許可する(何もしない)サポートされている認証プロバイダーを構成しないでください。

また、私はあなたは自分のAPIエンドポイントに対する要求をシミュレートするために、郵便配達やシオマネキを使用することをお勧めします、あなたは新しいX-ZUMO-AUTHヘッダを追加し、この問題を絞り込むことAuthTokenに値を設定する必要があります。また、ローカル側でこの問題をチェックしてから、トークンを使ってリクエストをシミュレートして、自分のコードがあなたの側で機能するかどうか、またはこれが紺碧側の問題であるかどうかを確認できます。クライアントの場合はCurrentUserを自分で設定せずにログにclient.LoginAsync("custom", JObject.FromObject(user))を使用できます。詳細については、アドリアンホールの本を参照してこの問題を確認することができます。

UPDATE:

はあなたのコメントによると、私は私の側でそれをテストしました。私はUseAppServiceAuthenticationミドルウェアを私のローカル側と紺側で使い、SigningKeyValidAudienceValidIssuerを私のウェブから読んでみました。Startup.MobileApp.cs下の設定を次のように

//if (string.IsNullOrEmpty(settings.HostName)) 
{ 
    app.UseAppServiceAuthentication(new AppServiceAuthenticationOptions 
    { 
     // This middleware is intended to be used locally for debugging. By default, HostName will 
     // only have a value when running in an App Service application. 
     SigningKey = ConfigurationManager.AppSettings["SigningKey"], 
     ValidAudiences = new[] { ConfigurationManager.AppSettings["ValidAudience"] }, 
     ValidIssuers = new[] { ConfigurationManager.AppSettings["ValidIssuer"] }, 
     TokenHandler = config.GetAppServiceTokenHandler() 
    }); 
} 

注:私は紺碧に認証/承認を有効にします。私のCustomAuthController.csについては、AppServiceLoginHandler.CreateTokenと私のweb.configの設定で、UseAppServiceAuthenticationミドルウェアが初期化されています。この設定では、私の側と青空側では期待どおりに動作する可能性があります。

次に、紺側に展開したときにUseAppServiceAuthenticationミドルウェアを無効にします。あなたが言及したように私は401に遭遇した、私はトークンの検証が失敗する可能性があると仮定した。私はCustom Authenticationを再チェックし、次のようにCustomAuthController.cs下の環境変数からSigningKeyValidAudienceValidIssuerを初期化する必要があることがわかった:

signingKey = Environment.GetEnvironmentVariable("WEBSITE_AUTH_SIGNING_KEY"); 
var website = Environment.GetEnvironmentVariable("WEBSITE_HOSTNAME"); 
audience = $"https://{website}/"; 
issuer = $"https://{website}/"; 

使用jwt.ioissaudが変更された、トークンを復号化するために、私それでも401が返ってくることがわかりました。AppServiceLoginHandler.CreateTokenを呼び出すと、寿命がnullに設定されています。私は値(例えばTimeSpan.FromDays(30))でそれを特定しようとしました、そして、それは紺碧側で動作します。

要約すると、この問題は、AppServiceLoginHandler.CreateTokenを呼び出すときにlifetimeパラメータの値が原因であり、紺側にnullの代わりに特定の値を設定する必要があります。さらに、専門家の説明のために問題hereを追加することができます。

また、モバイルバックエンドは、あなたがそれをオーバーライドすることができ、セキュリティトークンを処理するためのAppServiceTokenHandler.csを使用すると、特定のTokenHandlerパラメータUseAppServiceAuthenticationミドルウェアを使用した場合、その後、あなたがトークンの検証処理をデバッグすることができが。

+0

唯一のことは、自分のアプリがFBログインを提供しているので、Facebook認証プロバイダを有効にしていることです。しかし、私は自分のカスタム認証を使用してログインすることができます。それは失敗したサービスへの直後の要求です。私はフィドラーを使って試してみましたが、同じ{"message": "このリクエストでは承認が拒否されました。 – LDJ

+0

カスタム認証apicontrollerは匿名でアクセスできますが、この問題のコントローラには 'Authorize'属性があります。 FBプロバイダを一時的に削除して、この問題を絞り込めます。また、ローカル側でサーバーサイドプロジェクトを実行してから、カスタム認証がローカル側で機能するかどうかを確認してください。 –

+0

こんにちはBruce、私はFBプロバイダを削除し、同じ結果、401 Unauthorized errorを取得しました。無許可の理由をよりよく理解する方法はありますか? – LDJ

関連する問題