gpt4 book ai didi

azure - System.Security.Principal.WindowsIdentity (User.Identity) 无法填充 Azure AD 发送的声明

转载 作者:行者123 更新时间:2023-12-03 03:12:19 25 4
gpt4 key购买 nike

我已使用 OpenIdConnect 进行 Azure AD 身份验证。

我的应用程序是 Multi-Tenancy 的。我已使用 Azure AD 进行应用程序身份验证。

app.SetDefaultSignInAsAuthenticationType(CookieAuthenticationDefaults.AuthenticationType);
app.UseCookieAuthentication(new CookieAuthenticationOptions { });
app.UseOpenIdConnectAuthentication(
new OpenIdConnectAuthenticationOptions
{ ..other fields.. }

成功登录后,应用程序构建并启动后,它可以正常工作。 ClaimPrincipal 已正确填充 Azure AD 发送的数据。

当同一个应用程序在不同的浏览器中运行时,它会严重无法填充。

请提出建议。

提前致谢,拉胡尔

最佳答案

我的应用程序中的问题是由于我在应用程序中使用的中间件 Owin 的行为造成的。

Owin 的问题:在 OWIN 中,响应 header 集合是响应 cookie 的主要存储位置。然而,System.Web 将响应 cookie 存储在单独的 HttpContext.Response.Cookies 集合中,然后在发送响应之前将它们写入 Response.Headers 集合。如果在同一个请求上使用两种方法,这可能会导致 OWIN 冲突,因为 Response.Cookies 集合将覆盖通过 OWIN 响应 header 设置的任何 cookie。

不幸的是,这个问题没有通用的解决方案。 OWIN 中的 set-cookie header 无法通过 System.Web 的 Response.Cookies 集合可靠地重新解析和重定向。默认情况下,OWIN 组件也不能直接写入 System.Web 的 Response.Cookies 集合,因为这会损害其平台独立性。

解决方法:重新配置 CookieAuthenticationMiddleware 以直接写入 System.Web 的 cookie 集合

app.UseCookieAuthentication(new CookieAuthenticationOptions
{
// ...
CookieManager = new SystemWebCookieManager()
});

SystemWebCookieManager类定义如下:

public class SystemWebCookieManager : ICookieManager
{
public string GetRequestCookie(IOwinContext context, string key)
{
if (context == null)
{
throw new ArgumentNullException("context");
}

var webContext = context.Get<HttpContextBase>(typeof(HttpContextBase).FullName);
var cookie = webContext.Request.Cookies[key];
return cookie == null ? null : cookie.Value;
}

public void AppendResponseCookie(IOwinContext context, string key, string value, CookieOptions options)
{
if (context == null)
{
throw new ArgumentNullException("context");
}
if (options == null)
{
throw new ArgumentNullException("options");
}

var webContext = context.Get<HttpContextBase>(typeof(HttpContextBase).FullName);

bool domainHasValue = !string.IsNullOrEmpty(options.Domain);
bool pathHasValue = !string.IsNullOrEmpty(options.Path);
bool expiresHasValue = options.Expires.HasValue;

var cookie = new HttpCookie(key, value);
if (domainHasValue)
{
cookie.Domain = options.Domain;
}
if (pathHasValue)
{
cookie.Path = options.Path;
}
if (expiresHasValue)
{
cookie.Expires = options.Expires.Value;
}
if (options.Secure)
{
cookie.Secure = true;
}
if (options.HttpOnly)
{
cookie.HttpOnly = true;
}

webContext.Response.AppendCookie(cookie);
}

public void DeleteCookie(IOwinContext context, string key, CookieOptions options)
{
if (context == null)
{
throw new ArgumentNullException("context");
}
if (options == null)
{
throw new ArgumentNullException("options");
}

AppendResponseCookie(
context,
key,
string.Empty,
new CookieOptions
{
Path = options.Path,
Domain = options.Domain,
Expires = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc),
});
}
}

它不再给我带来任何登录问题。

关于azure - System.Security.Principal.WindowsIdentity (User.Identity) 无法填充 Azure AD 发送的声明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35555540/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com