2017-10-05 124 views
1

我有用於身份驗證的Azure移動服務。我有一個自定義身份驗證提供者,一旦證實,返回以下信息: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 
}); 

通知之Timespan設置爲null所以令牌不會過期。

然後向我的AMS發出後續請求,該請求的控制器受到Authorize()屬性的保護。然而,在我的任何斷點被擊中之前,這些都是失敗的,並有401 Unauthorized響應。

我可以從天青日誌看到這種情況的發生:

2017-10-05T12:18:54 PID [5524]信息請求時,方法= 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 ; 字符集= UTF-8 '',操作= DefaultContentNegotiator.Negotiate

2017-10-05T12:18:54 PID [5524]信息 操作= AuthorizeAttribute.OnAuthorizationAsync,狀態= 401 (未授權)

2017-10-05T12:18:54 PID [5524]信息 Operation = UserInfoController。ExecuteAsync,狀態= 401(未授權)

2017-10-05T12:18:54 PID [5524]信息響應,狀態= 401 (未授權),方法= POST, URL = https://mywebsite.azurewebsites.net/api/userinfo/update, 消息=「內容型='應用/ 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移動服務的已驗證請求?

感謝

編輯 因爲我已經禁用了Azure的所有其他認證提供但這並沒有解決問題。 我也在本地調試了代碼,並且只有在部署到Azure時,我的本地主機上纔會運行該問題。

回答

2

根據您的代碼,您使用的是Azure移動應用程序的自定義身份驗證。正如Adrian大廳關於Custom Authentication的書:

您必須在App Service中啓用身份驗證/授權。設置請求未通過身份驗證時採取的操作允許請求(無操作)並且不配置任何受支持的身份驗證提供程序。

此外,我建議你只使用郵遞員或小提琴手來模擬對您的API端點的要求,你需要添加一個新的X-ZUMO-AUTH頭和值設置爲AuthToken縮小這個問題。此外,您可以在本地檢查此問題,然後使用令牌模擬請求以查看您的代碼是否可以在您身邊工作,或者這是天藍色方面的問題。對於您的客戶,您可以使用client.LoginAsync("custom", JObject.FromObject(user))進行日誌記錄,而不需要自己設置CurrentUser。欲瞭解更多詳情,你可以關注阿德里安大廳的書來檢查這個問題。

UPDATE:

根據您的意見,我測試了它在我的身邊。我在本地和天藍色的一面使用了中間件UseAppServiceAuthentication,並從我的網站上閱讀了SigningKey,ValidAudience,ValidIssuerStartup.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() 
    }); 
} 

注:我在Azure上啓用身份驗證/授權。對於我的CustomAuthController.cs,我將AppServiceLoginHandler.CreateToken與我的web.config中的設置一起初始化爲UseAppServiceAuthentication中間件。在設置後,它可以按照預期在我的身邊和天藍色的一面工作。

然後我禁用了UseAppServiceAuthentication中間件部署到天藍色的一面。正如你所提到的,我遇到過401,我認爲令牌驗證可能會失敗。我複查Custom Authentication,發現你需要初始化SigningKeyValidAudienceValidIssuer從環境變量在你CustomAuthController.cs如下:

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

使用jwt.io令牌進行解碼,在issaud已經改變,但我發現它仍然會返回401.我注意到,當調用AppServiceLoginHandler.CreateToken時,我們都將終身設置爲null。我試圖用一個值來指定它(例如TimeSpan.FromDays(30)),然後它在azure方面工作。

總之,當調用AppServiceLoginHandler.CreateToken時,此問題可能是由於lifetime參數值造成的,因此您需要在azure端設置特定值而不是null。此外,您可以添加您的問題here專業解釋。

此外,行動後端將使用AppServiceTokenHandler.cs處理安全令牌,你可以使用UseAppServiceAuthentication中間件的時候,那麼你可以調試令牌驗證處理覆蓋它和具體的TokenHandler參數。

+0

我能想到的唯一的事情是我打開了Facebook身份驗證提供程序,因爲我的應用程序還提供了FB登錄。但是,我仍然可以使用我的自定義身份驗證登錄,它只是對發生故障的服務提出的後續請求。我嘗試過使用fiddler並得到相同的{「message」:「授權已被拒絕。」}響應。 – LDJ

+0

您的自定義autodapicontroller可以匿名訪問,而此問題的控制器具有'Authorize'屬性。您可以嘗試暫時移除FB提供商以縮小此問題的範圍。另外,請嘗試在本地運行您的服務器端項目,然後嘗試檢查自定義身份驗證是否可以在本地運行。 –

+0

嗨布魯斯,我已經刪除了FB提供程序,並得到相同的結果,401未經授權的錯誤。有沒有辦法更好地理解爲什麼它的未經授權? – LDJ

相關問題