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

Azure. Owin OpenId authentication. Added custom claims. AuthorizationCodeReceived is not called

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

 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
                 );
           }
            },
        });

但我想再添加一个应用程序 token(不是用户令牌)到声明列表中,以便能够在我网站的任何地方使用此令牌。对我来说,在每次身份验证会话中,我不需要多次从外部令牌提供者那里获取此令牌,这对我来说也是一件好事。

但是只有在我使用本地 IIS(运行本地),当我尝试使用 azure IIS 时,根本没有调用此方法。在这种情况下,我的用户无论如何都通过了身份验证,但是这个方法和来自 OpenIdConnectAuthenticationNotificationsRedirectToIdentityProvider 除外)的类似方法没有被触发。

我已经下载了 Katana 项目的 git 源代码并将这个项目引用到我而不是官方的 nuget 包来调试它,正如我目前认为的那样,我已经找到了它发生的原因。 AuthorizationCodeReceived "event" 方法是从 OpenIdConnectAuthenticationHandler class 在 AuthenticateCoreAsync 方法中调用的。而且,调用此方法要求以下检查必须给出 true 结果:

 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[=50= 中 运行 应用程序时,我看到了这些 POST 请求],但是当我在 azure portal 中部署我的应用程序时,我看不到这些 POST 请求(我已经调试了两个选项:在 local IISazure 门户 )。 综上所述,这是这些 运行 之间唯一的区别。 (Azure IIS 由于某种原因根本不发送 POST 请求)。Katana 项目(我检查过)中的任何其他方法都以相同的方式调用。

有人可以帮忙吗?

PS 注意,我只在清除浏览器数据后检查任何更改(cache/history 等等)。

答案如下:

azure portal中的授权应该如上图配置。如果您选择 LogIn with Azure Active Directory,那么应用服务授权将在您的应用之外进行,并且不会触发自定义授权。