2015-09-11 73 views
1

剛剛面對azure廣告applicationS和owin openid身份驗證的一個奇怪問題。 重現此問題。Azure活動目錄和owin身份驗證

1,創建與2015年VS雲選擇模板應用蔚藍廣告驗證的Web應用程序。

2.let標準代碼是一樣的。

3.let startup.auth原樣。

4.運行該應用程序在本地工作正常。在啓動

5.now變化代碼驗證如下

public partial class Startup 
{ 
    private static string clientId = ConfigurationManager.AppSettings["ida:ClientId"]; 
    private static string appKey = ConfigurationManager.AppSettings["ida:ClientSecret"]; 
    private static string aadInstance = ConfigurationManager.AppSettings["ida:AADInstance"]; 
    private static string tenantId = ConfigurationManager.AppSettings["ida:TenantId"]; 
    private static string postLogoutRedirectUri = ConfigurationManager.AppSettings["ida:PostLogoutRedirectUri"]; 

    public static readonly string Authority = aadInstance + tenantId; 

    // This is the resource ID of the AAD Graph API. We'll need this to request a token to call the Graph API. 
    string graphResourceId = "https://graph.windows.net"; 

    private static readonly log4net.ILog logger = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); 

    public void ConfigureAuth(IAppBuilder app) 
    { 
     ApplicationDbContext db = new ApplicationDbContext(); 

     app.SetDefaultSignInAsAuthenticationType(CookieAuthenticationDefaults.AuthenticationType); 
     logger.Debug("SetDefaultSignInAsAuthenticationType called"); 
     //app.UseCookieAuthentication(new CookieAuthenticationOptions()); 
     app.UseCookieAuthentication(
     new CookieAuthenticationOptions 
     { 
      Provider = new CookieAuthenticationProvider 
      { 
       OnResponseSignIn = ctx => 
       { 
        //logger.Debug("OnResponseSignIn called"); 
        ////ctx.Identity = TransformClaims(ctx.Identity); 
        //logger.Debug("TransformClaims called"); 
       } 
      } 
     }); 

app.UseOpenIdConnectAuthentication(
      new OpenIdConnectAuthenticationOptions 
      { 
       ClientId = clientId, 
       Authority = Authority, 
       PostLogoutRedirectUri = postLogoutRedirectUri, 

       Notifications = new OpenIdConnectAuthenticationNotifications() 
       { 
        // If there is a code in the OpenID Connect response, redeem it for an access token and refresh token, and store those away. 
        AuthorizationCodeReceived = (context) => 
        { 
         var code = context.Code; 
         ClientCredential credential = new ClientCredential(clientId, appKey); 
         string signedInUserID = context.AuthenticationTicket.Identity.FindFirst(ClaimTypes.NameIdentifier).Value; 
         logger.Debug("OnResponseSignIn called"); 
         logger.Debug("signedInUserID =" + signedInUserID); 
         TransformClaims(context.AuthenticationTicket.Identity); 
         logger.Debug("TransformClaims called"); 
         AuthenticationContext authContext = new AuthenticationContext(Authority, new ADALTokenCache(signedInUserID)); 
         AuthenticationResult result = authContext.AcquireTokenByAuthorizationCode(
         code, new Uri(HttpContext.Current.Request.Url.GetLeftPart(UriPartial.Path)), credential, graphResourceId); 



         return Task.FromResult(0); 
        }, 



        // we use this notification for injecting our custom logic 
        SecurityTokenValidated = (context) => 
        { 
         logger.Debug("SecurityTokenReceived called"); 
         //TransformClaims(); //pass the identity 
         return Task.FromResult(0); 
        }, 


       } 
      }); 
    } 


    private static void TransformClaims(System.Security.Claims.ClaimsIdentity identity) 
    { 
     if (identity != null && identity.IsAuthenticated == true) 
     { 
      var usserobjectid = identity.FindFirst(ConfigHelpers.Azure_ObjectIdClaimType).Value; 
       ((System.Security.Claims.ClaimsIdentity)identity).AddClaim(new System.Security.Claims.Claim("DBID", "999")); 
       ((System.Security.Claims.ClaimsIdentity)identity).AddClaim(new System.Security.Claims.Claim("Super","True")); 
     } 

     // return identity; 
    } 

} 

6.Run本地應用程序,將工作完美。

7.Deploy在Azure網站上的應用程序,並啓動AUTH owin通知方法永遠不會called.however應用的工作原理,但身份轉換不

有人可以幫幫忙有什麼不對,這是天藍色廣告的應用程序不支持cookies或通知不會觸發或代碼有問題。

只是爲了重新斷言別人比startup.àuth沒有標準的代碼被更改。

+0

嘗試刪除logger.Debug(「OnResponseSignIn called」);並再次部署。有時trace.writes可能會導致問題,而在Azure託管取決於什麼是你的跟蹤偵聽器... – Aram

+0

我添加了logger.debug(「OnResponseSignin Called」)來記錄所有事件是否觸發,如果這可能已經問題,它可能沒有完全在本地主機上運行,​​因此只找出發生了什麼事情,我添加了log4net記錄器,並且仍然在localhost上運行完美,而不是在azure網站上運行。所以我相信,這不是問題。你可以重現它,我已經完成了完整的代碼。 –

+1

這將工作在本地,但在蔚藍它不會...嘗試做遠程調試,看看有什麼不對... – Aram

回答

3

我知道這是有點老了,但我最近有完全相同的問題,花了幾個小時試圖瞭解爲什麼它不會在Azure中工作,但它在我的本地工作精絕。

這基本上是一個配置的問題:在portal.azure.com選擇您的應用程序,然後進入設置>認證/授權,並確保應用服務認證關。

事實證明,這個設置將接管你的startup.auth設置。

我有充分的信貸以維托裏奧Bertocci的指出了這一點給我。