我正在 .NET 5 API 中实现 Azure Active Directory。我目前这个 API 在 .NET Core 2.2 上完美运行。
这是旧的工作代码:
services.AddAuthentication(AzureADDefaults.BearerAuthenticationScheme)
.AddAzureADBearer(options =>
{
options.Instance = "https://login.microsoftonline.com/";
options.Domain = backOfficeADDomain;
options.TenantId = backOfficeADTenantId;
options.ClientId = $"api://{backOfficeADAPIClientId}";
options.ClientSecret = backOfficeADAPISecret;
});
Run Code Online (Sandbox Code Playgroud)
但自从更新到 .NET 5 后,我收到以下警告:
“AzureADAuthenticationBuilderExtensions.AddAzureADBearer(AuthenticationBuilder, Action)”已过时:“此已过时,将在未来版本中删除。请改用 Microsoft.Identity.Web 中的 AddMicrosoftWebApiAuthentication。请参阅 https://aka.ms/ms-identity-web。
所以我尝试将其更新为:
services.AddMicrosoftIdentityWebApiAuthentication(_configuration, "AzureAd");
Run Code Online (Sandbox Code Playgroud)
appsettings.json 中的“AzureAd”部分似乎是传递凭据的唯一方法。如何手动输入实例、域、ClientId 等?我不使用 appsettings.json,所有数据都是从 AzureKeyVault 手动检索的。
谢谢你!
azure azure-active-directory microsoft-identity-platform microsoft-identity-web
我正在使用 .net 5 Identity Web Ui 访问 Microsoft Graph。在哪里可以配置我的重定向 URI?
我需要指定完整的 Uri,因为由于位于具有 SSL 卸载功能的负载均衡器后面,因此从 callbackUri 生成的 Uri 不正确。
这是我当前的配置服务部分
services.AddAuthentication(OpenIdConnectDefaults.AuthenticationScheme)
.AddMicrosoftIdentityWebApp(Configuration.GetSection("AzureAd"))
.EnableTokenAcquisitionToCallDownstreamApi(initialScopes)
.AddMicrosoftGraph(Configuration.GetSection("DownstreamApi"))
.AddInMemoryTokenCaches();
Run Code Online (Sandbox Code Playgroud) c# azure-active-directory azure-ad-msal microsoft-graph-api microsoft-identity-web
是否可以在以下场景中将 SSO 与 B2C 结合使用?
services.AddAuthentication(OpenIdConnectDefaults.AuthenticationScheme)
.AddMicrosoftIdentityWebApp(Configuration.GetSection("web-AzureAdB2C"));
Run Code Online (Sandbox Code Playgroud)
builder.Services.AddMsalAuthentication(options =>
{
builder.Configuration.Bind("app-AzureAdB2C", options.ProviderOptions.Authentication);
options.ProviderOptions.DefaultAccessTokenScopes.Add("some-scope-for-server-api-access");
options.ProviderOptions.LoginMode = "redirect";
});
Run Code Online (Sandbox Code Playgroud)
身份验证对于这两个应用程序都可以正常工作,但用户必须登录这两个应用程序。
这两个应用程序都使用相同的 B2C 用户流程。只需在 Azure 门户中为用户流启用 SSO 选项不会改变任何内容,用户仍然需要手动登录这两个应用程序。
我不确定它是否可以简单地完成(隐式与授权流程),但我将不胜感激任何指导。非常感谢。
我正在使用新库在 Net5 API 上实现 AAD 身份验证Micorosft.Identity.Web该库公开了一种方法,该方法仅接受IConfiguration带有如下所示部分的方法app.settings
Micorosft.Identity.WebStartup.cs 上的身份验证方法
public void ConfigureServices(IServiceCollection services)
{
...
services.AddMicrosoftIdentityWebApiAuthentication(Configuration, "AzureAd");
...
}
Run Code Online (Sandbox Code Playgroud)
应用程序设置.json
"AzureAd": {
"Domain": "contoso.com",
"Instance": "https://login.microsoftonline.com/",
"TenantId": "00000000-0000-0000-0000-000000000000",
"ClientId": "00000000-0000-0000-0000-000000000000"
},
Run Code Online (Sandbox Code Playgroud)
现在的问题是,我正在使用 Azure 来部署此 API,当然所有这些敏感值都存储在 Key Vault 中。所以,我想找到一种方法来做到这一点:
services.AddMicrosoftIdentityWebApiAuthentication(new Configuration {
Domain = KeyVaultClient.GetSecret("domain"),
Instance = KeyVaultClient.GetSecret("instance")
TenantId = KeyVaultClient.GetSecret("tenant")
ClientId = KeyVaultClient.GetSecret("client")
});
Run Code Online (Sandbox Code Playgroud)
同时,我没有找到在 KeyVault 创建这个“部分”的方法,所以我能够做到这一点
services.AddMicrosoftIdentityWebApiAuthentication(KeyVaultClient.GetSecret("azureadconfig"));
Run Code Online (Sandbox Code Playgroud)
如何存档这些选项之一,或者如果我将所有值都保存在 Key Vault 上,如何避免依赖 app.settings
编辑注释
我将 Key Vault 作为配置提供程序,但我不知道如何以部分方式返回这些值,因为方法期望
我有一个由 HTTP 调用触发的 dotnet 5 Azure 函数(dotnet-isolated)。
该函数将由不同的 Azure 函数应用程序调用,我想使用 Azure AD 保护目标并使用“客户端凭据”OAuth2 流。
我在以下位置找到了一个适合我的场景的优秀示例:Microsoft GitHub Sample
我的问题是,该示例使用 WebApi 应用程序作为服务。这可以访问 HttpContext 对象,使用 Microsft.Identity.Web 程序集中名为“ValidateAppRole”的扩展方法
我的 Azure 函数确实有一个 HttpRequestData 类型的参数。它有一个包含键值对的 headers 属性。这些密钥之一称为“授权”,其值是 Azure AD 提供的访问令牌。我已通过 jwt.ms 运行此令牌,并可以确认“角色”集合包含我需要验证的自定义角色。所以我知道所需的信息已经存在;我只是不知道如何以编程方式检查它。
由于点网隔离的 Azure 函数似乎无法访问 HttpContext 对象。如何进行与以下内容等效的检查?
HttpContext.ValidateAppRole("CustomRoleName");
Run Code Online (Sandbox Code Playgroud) oauth-2.0 azure-active-directory azure-functions microsoft-identity-web
在我的项目中,我有 2 个数据库:一个是我的自定义数据库,另一个是ApplicationDbContext给Microsoft Identity我的。
在我的Startup.cs我有这样的代码:
public void Configure(IApplicationBuilder app, IWebHostEnvironment env,
ApplicationDbContext db, MyContext dbPSC)
{
// ...
db.Database.EnsureCreated();
db.Database.Migrate();
dbPSC.Database.EnsureCreated();
dbPSC.Database.Migrate();
}
Run Code Online (Sandbox Code Playgroud)
不知道什么时候有迁移的迁移吧?然后,我有两个错误:
ApplicationDbContext引发错误使用的最佳做法是什么?是否需要打电话进行迁移ApplicationDbContext?
我已经删除了该Migration文件夹。然后,改变了Startup.cs类似
public void Configure(IApplicationBuilder app, IWebHostEnvironment env,
ApplicationDbContext db, MyContext dbPSC)
{
// ...
db.Database.EnsureCreated();
dbPSC.Database.EnsureCreated();
}
Run Code Online (Sandbox Code Playgroud)
但是当应用程序启动时,它根本不创建任何表。AuditDbContext是因为我使用Audit.net
public class MyContext : AuditDbContext
{
public MyContext(DbContextOptions<MyContext> options) : base(options) { }
public DbSet<Message> Messages { …Run Code Online (Sandbox Code Playgroud) 我一直在努力解决我附加到 OnTokenValidated 的 Func 没有做它应该做的事情。
经过多次尝试不同的事情后:
services.Configure<MicrosoftIdentityOptions>(options =>
{
options.Events ??= new OpenIdConnectEvents();
options.Events.OnTokenValidated += context =>
{
context.Principal.AddIdentity(new ClaimsIdentity(new List<Claim> {new Claim("Foo", "Bar")}));
return Task.CompletedTask;
};
}
Run Code Online (Sandbox Code Playgroud)
按预期工作,并且将值为“Bar”的声明“Foo”添加到身份中。
但是,一旦我在代码中等待任务并使 func 异步,附加声明就不会添加到登录的身份中:
services.Configure<MicrosoftIdentityOptions>(options =>
{
options.Events ??= new OpenIdConnectEvents();
options.Events.OnTokenValidated += async context =>
{
var someService = context.HttpContext.RequestServices.GetRequiredService<ISomeService>();
var someValue = await someService.SomeMethod();
context.Principal.AddIdentity(new ClaimsIdentity(new List<Claim> {new Claim("Foo", "Bar")}));
};
}
Run Code Online (Sandbox Code Playgroud)
不起作用。需要明确的是,它没有错误,但是在该方法完成后,身份上不存在附加声明......
据我所知,通过消除各种事情,等待导致了它的崩溃,但 OnTokenValidated 的定义是:
Func<TokenValidatedContext,Task> OnTokenValidated
Run Code Online (Sandbox Code Playgroud)
所以似乎期望处理程序是异步的?
更新:2022-02-07 更进一步:
OnTicketReceived = ctx =>
{
throw new AuthenticationException("Sorry, you …Run Code Online (Sandbox Code Playgroud)