authentication - 使用 ASP.Net Core 检测外部 Azure AD 用户
问题描述
针对我的 AzureAD 租户进行身份验证的用户可以访问我的 ASP.Net Core 2.2 Web 应用程序。我可以像这样在控制器中获取他们的 UPN:this.User.FindFirst(ClaimTypes.Upn).Value
问题是来宾(外部)用户登录时。以上将失败,因为他们没有 UPN 声明。我在 User 对象上找不到任何属性或声明,表明该用户是否是我的租户的成员。
检测用户是否是来宾用户的正确方法是什么?
解决方案
正如@juunas 所说,您可以检查idp
索赔:
参考:https ://docs.microsoft.com/en-us/azure/active-directory/develop/id-tokens#payload-claims
您可以获取索赔值并检查不在同一租户中的用户帐户:
var idp = User.Claims.FirstOrDefault(c => c.Type == "http://schemas.microsoft.com/identity/claims/identityprovider")?.Value;
if (idp!=null)
{
//user is not in same tenant
}
此外,如果您想获取iss
标识构造和返回令牌的安全令牌服务 (STS) 的声明,您可以设置中间件以通过以下方式映射声明:
services.AddAuthentication(AzureADDefaults.AuthenticationScheme)
.AddAzureAD(options => Configuration.Bind("AzureAd", options));
services.Configure<OpenIdConnectOptions>(AzureADDefaults.OpenIdScheme, options =>
{
options.ClaimActions.Remove("iss");
});
并通过以下方式获取发行人:
var issuer = User.Claims.FirstOrDefault(c => c.Type == "iss")?.Value;
推荐阅读
- c# - 为 ASP.NET Core 创建自定义 CLI 命令
- python - PyQt5如何从/向QProcess读取/写入
- feign - OpenFeign Builder 默认客户端
- c# - 两个方法参数之间的泛型类型参数中的可空性不匹配
- python - 在 Python 中动态应用 setter 装饰器
- elasticsearch - 为什么 docker swarm 上的 elasticsearch 需要 transport.host=localhost 设置?
- flutter - 在异步函数内部未调用 notifyListeners
- c++ - C++ std::initializer_list 用法
- ocaml - 从列表中随机打印 OCAML
- java - ZXingScannerView 在另一个类而不是 Main