将Swagger添加到.net 4.8项目并使用AzureAD(Entra Id)

ui7jx7zq  于 2023-10-18  发布在  .NET
关注(0)|答案(2)|浏览(317)

我使用.Net 4.8(.net Framework不是.net Core)创建了一个默认的MVC项目,并添加了Entra Id(Azure AD)。

public void ConfigureAuth(IAppBuilder app)
  {
      OwinTokenAcquirerFactory factory = TokenAcquirerFactory.GetDefaultInstance<OwinTokenAcquirerFactory>();
      app.AddMicrosoftIdentityWebApi(factory);
      factory.Build();

  }

appsettings.json

{
  "AzureAd": {
    "Instance": "https://login.microsoftonline.com/",
    "ClientId": "id of application",
    "Audience": "api://.....",
    "TenantId": "id of tennant"
  }
}

我可以用Postman向那个API发送授权请求。
我现在要和斯瓦格鉴定。为此,我添加了Swagger 5.6

<package id="Swashbuckle" version="5.6.0" targetFramework="net48" />
  <package id="Swashbuckle.Core" version="5.6.0" targetFramework="net48" />

然后,我想显示“授权”按钮的 Swagger ,但它没有出现。
SwaggerConfig

c.OAuth2("oauth2")
      .Description("OAuth2 Implicit Grant")
      .Flow("implicit")
      .AuthorizationUrl("http://myazureurl/api/oauth/dialog")
      //.TokenUrl("https://tempuri.org/token")
      .Scopes(scopes =>
      {
          scopes.Add("read", "Read access to protected resources");
          scopes.Add("write", "Write access to protected resources");
      });

 c.EnableOAuth2Support(
     clientId: "myclientid",
     clientSecret: null,
     realm: "myrealm",
     appName: "Swagger UI"

 );

如何为Entra Id添加身份验证并使其与Swagger一起工作?

编辑在检查生成的swagger文档后,我将Flow更新为正确的值并设置了一个令牌URL,它现在看起来与我从一个正在工作的.net核心项目中获得的swagger文档几乎相同,但仍然没有按钮显示

这是工作的.net核心配置

ljo96ir5

ljo96ir51#

这是个棘手的问题。据我所知,如果认证不正确,授权按钮不会出现。我的猜测是,在生成的Swagger JSON中生成的securityDefinitions部分中有一些不正确的地方。我发现this other question有点类似。我假设.Token方法在你的代码中也被正确配置了(就像你在这里的配置中注解的那样)。
我建议您检查生成的Swagger JSON,以确保securityDefinitionssecurity部分的格式正确,并包含预期的值。

tkclm6bt

tkclm6bt2#

我认为在安装所需的NuGet包(SwashbuckleMicrosoft.Owin.Security.JwtMicrosoft.Owin.Security.OpenIdConnect)后,您应该在Startup.cs中配置Azure AD身份验证

public void ConfigureAuth(IAppBuilder app)
{
    app.UseOpenIdConnectAuthentication(new OpenIdConnectAuthenticationOptions
    {
        ClientId = Configuration["AzureAd:ClientId"],
        Authority = $"{Configuration["AzureAd:Instance"]}{Configuration["AzureAd:TenantId"]}",
        RedirectUri = Configuration["AzureAd:RedirectUri"],
        PostLogoutRedirectUri = Configuration["AzureAd:PostLogoutRedirectUri"],
        TokenValidationParameters = new TokenValidationParameters
        {
            ValidateIssuer = false,
            //you can add here any additional validation parameters if required
        },
        Notifications = new OpenIdConnectAuthenticationNotifications
        {
            //you can add here any required event handlers
        }
    });

    app.UseJwtBearerAuthentication(new JwtBearerAuthenticationOptions
    {
        AuthenticationMode = AuthenticationMode.Active,
        TokenValidationParameters = new TokenValidationParameters
        {
            ValidAudience = Configuration["AzureAd:Audience"],
            ValidateIssuer = false,
            //you can add here any additional validation parameters if required
        }
    });
}

现在尝试使用c.OAuth2方法更新Startup.csConfigureAuth方法中的Swagger配置!

c.OAuth2("oauth2")
    .Description("OAuth2 Implicit Grant")
    .Flow("implicit")
    .AuthorizationUrl("https://login.microsoftonline.com/{tenant}/oauth2/v2.0/authorize")
    .Scopes(scopes =>
    {
        scopes.Add("api://<client-id>/access_as_user", "Access the API");
    });

同时将Swagger中间件添加到Startup.cs

app.UseSwagger();
app.UseSwaggerUI(c =>
{
    c.OAuthClientId("<client-id>");
    c.SwaggerEndpoint("/swagger/v1/swagger.json", "My API V1");
});

再次尝试运行应用程序并访问Swagger UI,如果操作正确,您应该会看到一个Authorize按钮。

相关问题