我几乎在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注意,我只在清除浏览器数据(缓存/历史记录等)后才检查任何更改。