services.AddAuthentication("Bearer")
这将默认身份验证方案设置为Bearer
.
services.AddAuthentication(
options =>
{
options.DefaultScheme = "Cookies";
options.DefaultChallengeScheme = "oidc";
})
这将默认身份验证方案设置为Cookies
(以及默认的挑战方案oidc
)。所以此后,默认不再调用承载认证。
配置多个身份验证方案是完全可以的,并且在许多情况下也是必需的。但您必须明白,框架只能自动调用一个默认值(对于每个身份验证操作)。我已经解释过了对于这个问题更详细 https://stackoverflow.com/a/52493428/216074但这个想法基本上是,当你不做任何特殊的事情时,那么当请求进来时,将使用默认的身份验证方案来对用户进行身份验证。
所以在你的情况下,Cookies
作为默认方案,用户将尝试通过其 cookie 登录。对于以用户为中心的应用程序来说,这通常是一个很好的默认设置,因为大多数用户将使用 cookie 来验证自己的身份。另一方面,对这些应用程序的 API 访问更加特殊,通常仅限于少数控制器或路由;因此,将承载身份验证作为默认值通常没有多大用处。
So when Cookies
是默认的,而且只能有一个默认的,会自动调用,那么如何使用其他方案呢?答案是授权政策。
一般来说,授权策略允许您根据某些规则限制访问。策略基本上是这些规则的集合。出于授权目的,您通常会检查声明值以控制某人是否有权执行某些操作。然而,授权策略还有另一方面,那就是它们允许您指定认证方案作为规则。
当您使用以下方式创建授权策略时AuthorizationPolicyBuilder https://learn.microsoft.com/en-us/dotnet/api/microsoft.aspnetcore.authorization.authorizationpolicybuilder?view=aspnetcore-2.2,您可以用它指定它需要的身份验证方案。当授权策略用于授权请求,它会自动认证这些方案(如果尚未经过身份验证)。
因此,您可以使用此机制来触发 API 控制器的承载身份验证,而不会影响默认的 cookie 身份验证,只要您不指定任何其他内容,就会使用默认的 cookie 身份验证。
[Authorize("ApiPolicy")]
public class MyApiController : ControllerBase
{
// …
}
In Startup.ConfigureServices
:
services.AddAuthorization(options =>
{
var apiPolicy = new AuthorizationPolicyBuilder("Bearer")
.RequireAuthenticatedUser()
.Build();
options.AddPolicy("ApiPolicy", apiPolicy);
});
这样,您就配置了一个自定义策略,您可以随时扩展该策略以添加其他要求(例如特殊声明),并且您可以使用该策略来授权客户端访问您的 API。
如果您只需要少数操作或控制器,您还可以直接在[Authorize]
属性。这使您不必创建自定义授权策略,但另一方面,如果您想通过附加要求(或更改身份验证方案)扩展策略,当然需要更多的重复和维护:
[Authorize(AuthenticationSchemes = "Bearer")]
public class MyApiController : ControllerBase
{
// …
}
请注意,最后,这将also结果将临时创建一个策略来授权用户。所以效果和潜在机制确实是一样的。