You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

3.5 KiB

说明

关于 共享框架

随着 .NET Core 3.0 的发布,许多 ASP.NET Core 程序集不再作为包发布到 NuGet。 相反,程序集包含在 Microsoft.AspNetCore.App 共享框架中,该框架随 .NET Core SDK 和运行时安装程序一起安装。

  • Web项目一般自动包含 AspMicrosoft.AspNetCore.App 共享框架,即 共享框架由项目的Sdk属性Microsoft.NET.Sdk.Web自动引入
<Project Sdk="Microsoft.NET.Sdk.Web">
  <!--共享项目由上面Sdk类型Microsoft.NET.Sdk.Web自动引入-->
  <PropertyGroup>
    <TargetFramework>net7.0</TargetFramework>
    <Nullable>enable</Nullable>
    <ImplicitUsings>enable</ImplicitUsings>
  </PropertyGroup>

  <ItemGroup>
    <!--Nuget包引用-->
    <PackageReference Include="Microsoft.AspNetCore.OpenApi" Version="7.0.5" />
    <PackageReference Include="Swashbuckle.AspNetCore" Version="6.4.0" />
  </ItemGroup>

  <ItemGroup>
    <!--项目引用-->
    <ProjectReference Include="..\xx.csproj" />
  </ItemGroup>

</Project>
  • 类库项目等,要手动引入(无法使用nuget包的方式引入)
<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <TargetFramework>net7.0</TargetFramework>
    <ImplicitUsings>enable</ImplicitUsings>
    <Nullable>enable</Nullable>
  </PropertyGroup>

  <ItemGroup>
    <!-- 手动引入共享框架(不指定版本,自动跟随项目版本),多目标项目,也可以使用变量根据目标选择引入-->
	<FrameworkReference Include="Microsoft.AspNetCore.App" />
  </ItemGroup>

  <ItemGroup>
    <!--Nuget包引用-->
    <PackageReference Include="Microsoft.AspNetCore.OpenApi" Version="7.0.5" />
    <PackageReference Include="Swashbuckle.AspNetCore" Version="6.4.0" />
  </ItemGroup>

  <ItemGroup>
    <!--项目引用-->
    <ProjectReference Include="..\xx.csproj" />
  </ItemGroup>

</Project>
<!-- 多目标示例-->
<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <TargetFrameworks>netstandard2.0;netcoreapp3.0;netcoreapp3.1;net5.0;net6.0;net7.0</TargetFrameworks>
    <PackageTags>aspnetcore;authentication;security;basicauth</PackageTags>
    <Configurations>Debug;Release;CodeQL</Configurations>
  </PropertyGroup>

  <!-- netstandard2.0 版本引入老版本的包(Microsoft.AspNetCore.Authentication等) -->
  <ItemGroup Condition="'$(TargetFramework)' == 'netstandard2.0'">
    <PackageReference Include="Microsoft.AspNetCore.Authentication" Version="2.0" />
    <PackageReference Include="Microsoft.AspNetCore.Http.Abstractions" Version="2.0" />
    <PackageReference Include="Microsoft.Extensions.Options.ConfigurationExtensions" Version="2.0" />
  </ItemGroup>

  <!-- 高版本手动引入共享框架Microsoft.AspNetCore.App由共享框架引入模块 -->
  <ItemGroup Condition="'$(TargetFramework)' != 'netstandard2.0'">
    <FrameworkReference Include="Microsoft.AspNetCore.App" />
  </ItemGroup>
</Project>

认证与授权实质关系

  • 认证与授权是两个独立的 中间件,通过请求上下文的 User 属性进行 “交互”;
  • 认证 -> 认证凭据放入 请求上下文(HttpContext)的User属性(实质是一个ClaimsPrincipal对象)
  • 授权 -> 先从请求上下文的User属性拿到凭据ClaimsPrincipal 然后进行权限判定;

认证使用方式

  • 配合授权一起使用api控制器或方法上加特性[Authorize],由框架自动调用
  • 在Api方法内部调用 HttpContext 扩展方法: var result = HttpContext.AuthenticateAsync(); 拿到认证结果,手动执行自己的逻辑。