Azure上。 Owin OpenId身份验证。添加了自定义声明AuthorizationCodeReceived未调用

时间:2018-04-10 17:28:05

标签: azure azure-active-directory owin openid katana

我几乎在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
                 );
           }
            },
        });

但我想在声明列表中再添加一个应用程序令牌(非用户令牌),以便能够在我的网站上的任何位置使用此令牌。另外,对我而言,我不需要每次验证会话从我的外部令牌提供程序获取此令牌超过一次。

但是,当我尝试使用我的本地IIS(在本地运行)时,我会尝试添加逻辑(AuthorizationCodeReceived以及OpenIdConnectAuthenticationNotifications中的其他方法)要使用azure IIS,此方法根本没有被调用过。在这种情况下,我的用户无论如何都要经过身份验证,但是此方法和OpenIdConnectAuthenticationNotifications中的类似方法(RedirectToIdentityProvider除外)不会被触发。

我已经下载了Katana项目的git源代码,并将此项目引用到我的而不是官方的nuget包来调试它,正如我认为的那样,我已经找到了它发生的原因。在AuthorizationCodeReceived方法中从OpenIdConnectAuthenticationHandler类调用AuthenticateCoreAsync“event”方法。但是,需要调用此方法,以下检查必须提供 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 中运行应用时,我看到了这些POST请求,但我看不到这些POST 1}}我在 azure portal 中部署应用程序时的请求(我调试了两个选项:在本地IIS azure portal 中) 。 综上所述,这是这些运行之间唯一的区别。 (Azure IIS根本没有发送POST请求。)Katana项目(我检查过)中的其他任何方法都以相同的方式调用。

有人可以帮忙吗?

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

1 个答案:

答案 0 :(得分:0)

答案如下:

Auth configuration

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