代码之家  ›  专栏  ›  技术社区  ›  dododo

蔚蓝色的Owin OpenId身份验证。添加了自定义声明。未调用AuthorizationCodeReceived

  •  1
  • dododo  · 技术社区  · 6 年前

    我几乎已经配置了 OpenId owin authentication / authorization 在里面 Azure Active Directory .我的配置如下:

     app.SetDefaultSignInAsAuthenticationType(CookieAuthenticationDefaults.AuthenticationType);
     app.UseCookieAuthentication(new CookieAuthenticationOptions()
     {
         CookieName = "AppServiceAuthSession"
     });
    
     app.UseOpenIdConnectAuthentication(new OpenIdConnectAuthenticationOptions
     {
    
         ClientId = ClientId,
         Authority = _authority,
         PostLogoutRedirectUri = PostLogoutRedirectUri,
         RedirectUri = PostLogoutRedirectUri,
         Notifications = new OpenIdConnectAuthenticationNotifications
         {
               AuthenticationFailed = context =>
               {
                     context.HandleResponse();
                     context.Response.Redirect("/Error?message=" + context.Exception.Message);
                     return Task.FromResult(0);
               },                   
               AuthorizationCodeReceived = async context =>
               {
                     var id = new ClaimsIdentity(context.AuthenticationTicket.Identity.AuthenticationType);
                     id.AddClaims(context.AuthenticationTicket.Identity.Claims);
                     var appToken = "MyToken";
                     id.AddClaim(new Claim("MyTokenKey", appToken));
    
                     context.AuthenticationTicket = new AuthenticationTicket
                     (
                          new ClaimsIdentity(id.Claims, context.AuthenticationTicket.Identity.AuthenticationType),
                            context.AuthenticationTicket.Properties
                     );
               }
                },
            });
    

    但我想再添加一个应用程序 代币 (不是用户令牌)到声明列表,以便能够在我的站点上的任何位置使用此令牌。另外,对于我来说,每次身份验证会话都不需要从外部令牌提供商处获取该令牌多次,这一点也很好。

    但我要补充我的逻辑的地方( AuthorizationCodeReceived 以及来自 OpenIdConnectAuthenticationNotifications )仅当我使用本地IIS(在本地运行)时调用,当我尝试使用azure IIS时,根本没有调用此方法。在本例中,我的用户已通过身份验证,但此方法和 OpenIdConnectAuthenticationNotifications (除 RedirectToIdentityProvider )未被激发。

    我已经下载了的git源代码 Katana 并将此项目引用到我的而不是正式的nuget包来调试其,正如我目前所想,我已经找到了发生这种情况的原因。这个 已收到授权代码 从调用“event”方法 OpenIdConnectAuthenticationHandler 中的类 AuthenticateCoreAsync 方法但是,调用此方法时,要求下面的检查必须给出 符合事实的 结果:

     if (string.Equals(Request.Method, "POST", StringComparison.OrdinalIgnoreCase)
     && !string.IsNullOrWhiteSpace(Request.ContentType) // May have media/type; charset=utf-8, allow partial match.
     && Request.ContentType.StartsWith("application/x-www-form-urlencoded", StringComparison.OrdinalIgnoreCase)
     && Request.Body.CanRead)
     {
     //some necessary preparation to call `AuthorizationCodeReceived` event method
     } 
    

    正如我们所看到的,这种检查只允许 POST 请求,我看到这些 邮递 在中运行应用程序时的请求 本地IIS ,但我看不到这些 邮递 在中部署应用程序时请求 azure门户 (我已经调试了两个选项:on 本地IIS 并且在 azure门户 )。 如上所述,这是这些运行之间唯一的区别。(Azure IIS不发送 邮递 出于某种原因请求)。中的任何其他方法 卡塔纳 项目(我选中了该项目)以相同的方式调用。

    有人能帮忙吗?

    注意,我只在清除浏览器数据(缓存/历史记录等)后才检查任何更改。

    1 回复  |  直到 6 年前
        1
  •  0
  •   dododo    6 年前

    答案如下:

    Auth configuration

    azure portal中的授权应如上所示进行配置。如果你选择 LogIn with Azure Active Directory ,则应用程序服务验证在应用程序外部进行,并且不会触发自定义授权。