gpt4 book ai didi

c# - 配置不同的授权/认证方案

转载 作者:行者123 更新时间:2023-11-30 21:45:17 26 4
gpt4 key购买 nike

我正在 ASP.NET Core 1.0.1 应用程序上实现安全性,该应用程序用作 Web API。我试图了解是否以及如何实现 2 种不同的身份验证方案。
理想情况下,我希望允许通过 Azure Active Directory 或通过用户名/密码对联系应用程序的特定后端服务进行身份验证。
是否可以为端点通过 Azure AD 或 JWT token 进行身份验证的设置配置 ASP.NET Core?

我尝试过类似的方法,但在调用生成 token 端点时,我得到了一个 500,但没有任何信息。删除 Azure AD 配置可使端点完美运行:

services.AddAuthorization(configuration =>
{
configuration.AddPolicy("Bearer", new AuthorizationPolicyBuilder()
.AddAuthenticationSchemes(JwtBearerDefaults.AuthenticationScheme)
.RequireAuthenticatedUser().Build());

configuration.AddPolicy("OpenIdConnect", new AuthorizationPolicyBuilder()
.AddAuthenticationSchemes(OpenIdConnectDefaults.AuthenticationScheme)
.RequireAuthenticatedUser().Build());
});

app.UseOpenIdConnectAuthentication(new OpenIdConnectOptions
{
ClientId = Configuration["Authentication:AzureAD:ClientId"],
Authority
= Configuration["Authentication:AzureAd:AADInstance"]
+ Configuration["Authentication:AzureAd:TenantId"],
ResponseType = OpenIdConnectResponseType.IdToken,
SignInScheme = CookieAuthenticationDefaults.AuthenticationScheme
});

app.UseJwtBearerAuthentication(new JwtBearerOptions
{
TokenValidationParameters = new TokenValidationParameters
{
ClockSkew = TimeSpan.FromMinutes(1),
IssuerSigningKey = TokenAuthenticationOptions.Credentials.Key,
ValidateAudience = true,
ValidateIssuer = true,
ValidateLifetime = true,
ValidateIssuerSigningKey = true,
ValidAudience = TokenAuthenticationOptions.Audience,
ValidIssuer = TokenAuthenticationOptions.Issuer
}
});

最佳答案

在添加授权策略和身份验证中间件时使用 OpenIdConnectDefaults.AuthenticationScheme 常量。

此处您使用的是 OpenIdConnectDefaults。好的。保持这条线。

services.AddAuthorization(configuration =>
{
...

configuration.AddPolicy("OpenIdConnect", new AuthorizationPolicyBuilder()
.AddAuthenticationSchemes(OpenIdConnectDefaults.AuthenticationScheme) // keep
.RequireAuthenticatedUser().Build());
});

此处您使用的是 CookieAuthenticationDefaults。删除该行。

app.UseOpenIdConnectAuthentication(new OpenIdConnectOptions
{
...

SignInScheme = CookieAuthenticationDefaults.AuthenticationScheme // delete
});

为什么?

当您的 OpenIdConnect 授权策略运行时,它将查找名为 OpenIdConnectDefaults.AuthenticationScheme 的身份验证方案。它不会找到一个,因为注册的 OpenIdConnect 中间件名为 CookieAuthenticationDefaults.AuthenticationScheme。如果删除该错误行,则代码将为 automatically use the appropriate default.

编辑:样本评论

第二种合理方案

The linked sample application from the comments调用 services.AddAuthentication 并将 SignInScheme 设置为“Cookies”。这会更改所有身份验证中间件的默认登录方案。结果:对 app.UseOpenIdConnectAuthentication 的调用现在等效于此:

app.UseOpenIdConnectAuthentication(new OpenIdConnectOptions 
{
SignInScheme = CookieAuthenticationDefaults.AuthenticationScheme
}

这正是 Camilo 最初拥有的东西。那为什么我的回答有效?

我的回答有效,因为我们选择什么 SignInScheme 名称并不重要;重要的是这些名称是一致的。如果我们将我们的 OpenIdConnect 身份验证登录方案设置为“Cookies”,那么在添加授权策略时,我们需要像这样按名称请求该方案:

services.AddAuthorization(configuration =>
{
...

configuration.AddPolicy("OpenIdConnect", new AuthorizationPolicyBuilder()
.AddAuthenticationSchemes(CookieAuthenticationDefaults.AuthenticationScheme) <----
.RequireAuthenticatedUser().Build());
});

第三种合理方案

为了强调一致性的重要性,这里提供第三种合理的方案,使用任意登录方案名称。

services.AddAuthorization(configuration =>
{
configuration.AddPolicy("OpenIdConnect", new AuthorizationPolicyBuilder()
.AddAuthenticationSchemes("Foobar")
.RequireAuthenticatedUser().Build());
});

此处您使用的是 CookieAuthenticationDefaults。删除该行。

app.UseOpenIdConnectAuthentication(new OpenIdConnectOptions
{
SignInScheme = "Foobar"
});

关于c# - 配置不同的授权/认证方案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40312503/

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