Mic*_*gan 12 c# orchardcms azure-active-directory microsoft-graph-api
我正在尝试对内部网的 Azure AD 和 Graph 进行身份验证(基于 Orchard CMS),这在我的本地机器上按预期运行,但是,当访问将是生产站点的站点时(已经在我们的内部 dns 上设置了 ssl ),我有时会收到上述错误,它相对不一致,我部门中的其他人在访问时通常会收到此错误。
我的身份验证控制器如下:
public void LogOn()
{
if (!Request.IsAuthenticated)
{
// Signal OWIN to send an authorization request to Azure.
HttpContext.GetOwinContext().Authentication.Challenge(
new AuthenticationProperties { RedirectUri = "/" },
OpenIdConnectAuthenticationDefaults.AuthenticationType);
}
}
public void LogOff()
{
if (Request.IsAuthenticated)
{
ClaimsPrincipal _currentUser = (System.Web.HttpContext.Current.User as ClaimsPrincipal);
// Get the user's token cache and clear it.
string userObjectId = _currentUser.Claims.First(x => x.Type.Equals(ClaimTypes.NameIdentifier)).Value;
SessionTokenCache tokenCache = new SessionTokenCache(userObjectId, HttpContext);
HttpContext.GetOwinContext().Authentication.SignOut(OpenIdConnectAuthenticationDefaults.AuthenticationType, CookieAuthenticationDefaults.AuthenticationType);
}
SDKHelper.SignOutClient();
HttpContext.GetOwinContext().Authentication.SignOut(
OpenIdConnectAuthenticationDefaults.AuthenticationType, CookieAuthenticationDefaults.AuthenticationType);
}
Run Code Online (Sandbox Code Playgroud)
我的 openid 选项配置如下:
AntiForgeryConfig.UniqueClaimTypeIdentifier = ClaimTypes.NameIdentifier;
var openIdOptions = new OpenIdConnectAuthenticationOptions
{
ClientId = Settings.ClientId,
Authority = "https://login.microsoftonline.com/common/v2.0",
PostLogoutRedirectUri = Settings.LogoutRedirectUri,
RedirectUri = Settings.LogoutRedirectUri,
Scope = "openid email profile offline_access " + Settings.Scopes,
TokenValidationParameters = new TokenValidationParameters
{
ValidateIssuer = false,
},
Notifications = new OpenIdConnectAuthenticationNotifications
{
AuthorizationCodeReceived = async (context) =>
{
var claim = ClaimsPrincipal.Current;
var code = context.Code;
string signedInUserID = context.AuthenticationTicket.Identity.FindFirst(ClaimTypes.NameIdentifier).Value;
TokenCache userTokenCache = new SessionTokenCache(signedInUserID,
context.OwinContext.Environment["System.Web.HttpContextBase"] as HttpContextBase).GetMsalCacheInstance();
ConfidentialClientApplication cca = new ConfidentialClientApplication(
Settings.ClientId,
Settings.LogoutRedirectUri,
new ClientCredential(Settings.AppKey),
userTokenCache,
null);
AuthenticationResult result = await cca.AcquireTokenByAuthorizationCodeAsync(code, Settings.SplitScopes.ToArray());
},
AuthenticationFailed = (context) =>
{
context.HandleResponse();
context.Response.Redirect("/Error?message=" + context.Exception.Message);
return Task.FromResult(0);
}
}
};
var cookieOptions = new CookieAuthenticationOptions();
app.SetDefaultSignInAsAuthenticationType(CookieAuthenticationDefaults.AuthenticationType);
app.UseCookieAuthentication(cookieOptions);
app.UseOpenIdConnectAuthentication(openIdOptions);
Run Code Online (Sandbox Code Playgroud)
重定向的 url 在 apps.dev.microsoft.com 和我们本地化的 web 配置中保持一致。
Ven*_*sky 16
就我而言,这是一个非常奇怪的问题,因为它不会对每个人都发生,只有少数客户和开发人员有这个问题。
如果您仅在 chrome(或具有相同引擎的浏览器)中遇到此问题,您可以尝试在 chrome 上将此标志设置为禁用。
这里发生的事情是 chrome 有这个不同的安全规则,即“如果没有设置安全属性的没有 SameSite 限制的 cookie,它将被拒绝”。所以你可以禁用这个规则,它会起作用。
或者,您也可以设置 Secure 属性,但我不知道该怎么做;(
检查 AD 应用注册 --> 设置 --> 回复 URL 中提到的 URL。例如,如果 url 是https://localhost:44348/
转到 MVC 项目 --> 属性(右键单击和属性)--> Web 部分 --> 开始 URL 和项目 URL 也应该是https://localhost:44348/
这为我解决了这个问题。另一个选项是在 Startup.Auth 中动态设置 AD 身份验证后的重定向 URL
这行代码解决了问题,错误的原因是 ASP.NET 还没有创建会话信息。函数“authFailed.OwinContext.Authentication.Challenge()”用身份验证所需的信息填充标头。
app.UseOpenIdConnectAuthentication(new OpenIdConnectAuthenticationOptions()
{
Notifications = new OpenIdConnectAuthenticationNotifications()
{
AuthenticationFailed = AuthenticationFailedNotification<OpenIdConnect.OpenIdConnectMessage, OpenIdConnectAuthenticationOptions> authFailed =>
{
if (authFailed.Exception.Message.Contains("IDX21323"))
{
authFailed.HandleResponse();
authFailed.OwinContext.Authentication.Challenge();
}
await Task.FromResult(true);
}
}
});
Run Code Online (Sandbox Code Playgroud)
请参阅Chris Ross(在 github 上称为 Tratcher)的System.Web 响应 cookie 集成问题。OWIN cookie 管理器和 ASP.NET Framework 中内置的原始 cookie 管理可能会以无益的方式发生冲突,并且没有通用的解决方案。但是,在设置 OIDC 身份验证时,我发现该链接中建议的解决方法对我有用:
app.UseCookieAuthentication(new CookieAuthenticationOptions
{
// ...
CookieManager = new SystemWebCookieManager()
});
Run Code Online (Sandbox Code Playgroud)
和:
OpenIdConnectAuthenticationOptions.CookieManager = new SystemWebCookieManager();
Run Code Online (Sandbox Code Playgroud)
这会导致 OWIN 使用 ASP.NET Framework cookie jar/store 并避免冲突。我想他会有副作用,所以要小心!阅读链接以获得完整的解释。
由于它不一致,这让我相信您看到的错误是由人们所说的“Katana bug #197”引起的。
幸运的是,有一个名为Kentor.OwinCookieSaver的 nuget 包的解决方法。
安装 nuget 包后添加app.UseKentorOwinCookieSaver();
之前的app.UseCookieAuthentication(cookieOptions);
.
有关更多信息,请查看GitHub 上的 Kentor.OwinCookieSaver 存储库。
归档时间: |
|
查看次数: |
27560 次 |
最近记录: |