天蓝色。 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 时,根本没有调用此方法。在这种情况下,我的用户无论如何都通过了身份验证,但是这个方法和来自 OpenIdConnectAuthenticationNotifications
(RedirectToIdentityProvider
除外)的类似方法没有被触发。
我已经下载了 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 IIS 和 azure 门户 )。
综上所述,这是这些 运行 之间唯一的区别。 (Azure IIS 由于某种原因根本不发送 POST
请求)。Katana
项目(我检查过)中的任何其他方法都以相同的方式调用。
有人可以帮忙吗?
PS 注意,我只在清除浏览器数据后检查任何更改(cache/history 等等)。
答案如下:
azure portal中的授权应该如上图配置。如果您选择 LogIn with Azure Active Directory
,那么应用服务授权将在您的应用之外进行,并且不会触发自定义授权。
我几乎已经在 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 时,根本没有调用此方法。在这种情况下,我的用户无论如何都通过了身份验证,但是这个方法和来自 OpenIdConnectAuthenticationNotifications
(RedirectToIdentityProvider
除外)的类似方法没有被触发。
我已经下载了 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 IIS 和 azure 门户 )。
综上所述,这是这些 运行 之间唯一的区别。 (Azure IIS 由于某种原因根本不发送 POST
请求)。Katana
项目(我检查过)中的任何其他方法都以相同的方式调用。
有人可以帮忙吗?
PS 注意,我只在清除浏览器数据后检查任何更改(cache/history 等等)。
答案如下:
azure portal中的授权应该如上图配置。如果您选择 LogIn with Azure Active Directory
,那么应用服务授权将在您的应用之外进行,并且不会触发自定义授权。