【解決方法】OWIN を使用した ASP.NET Web フォームでの Azure AD 認証

プログラミングQA


OWIN モジュールを使用して、ASP.Net Web フォーム Web サイト/アプリケーションに Azure 経由の認証を正常に実装しました。 ただし、認証されたユーザーの ID を取得しようとすると、空の文字列が表示または返されるようです

これが私の認証コードです

VB
Try
          System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls11 Or SecurityProtocolType.Tls12
          Dim redirectUri As String = ConfigurationManager.AppSettings("ida:RedirectUri")
          Dim authProperties As New AuthenticationProperties
          authProperties.RedirectUri = redirectUri
          HttpContext.Current.GetOwinContext().Authentication.Challenge(authProperties, OpenIdConnectAuthenticationDefaults.AuthenticationType)
      Catch ex As Exception
          LblErrorMsg.Text = ex.Message
          PnlError.Visible = True
          Exit Sub
      End Try

そしてこれが私のStartup.vbクラスです

VB.NET
Imports Microsoft.Owin.Security.OpenIdConnect
Imports Microsoft.Owin.Security.Notifications
Imports System.Threading.Tasks
Imports System
Imports Microsoft.Owin.Host.SystemWeb

<Assembly: OwinStartup("MyStartupClass", GetType(Startup))>
Public Class Startup
    Private clientId As String = System.Configuration.ConfigurationManager.AppSettings("ida:ClientId")
    Private redirectUri As String = System.Configuration.ConfigurationManager.AppSettings("ida:RedirectUri")
    Shared tenant As String = System.Configuration.ConfigurationManager.AppSettings("ida:Tenant")
    Private authority As String = String.Format(System.Globalization.CultureInfo.InvariantCulture, System.Configuration.ConfigurationManager.AppSettings("ida:Authority"), tenant)

    Public Sub Configuration(ByVal app As IAppBuilder)
        app.SetDefaultSignInAsAuthenticationType(CookieAuthenticationDefaults.AuthenticationType)
        app.UseCookieAuthentication(New CookieAuthenticationOptions With {
            .CookieManager = New SystemWebCookieManager()
        })
        app.UseOpenIdConnectAuthentication(New OpenIdConnectAuthenticationOptions With {
            .ClientId = clientId,
            .Authority = authority,
            .RedirectUri = redirectUri,
            .PostLogoutRedirectUri = redirectUri,
            .Scope = OpenIdConnectScope.OpenIdProfile,
            .ResponseType = OpenIdConnectResponseType.IdToken,
            .TokenValidationParameters = New TokenValidationParameters() With {
                .ValidateIssuer = False
            },
            .Notifications = New OpenIdConnectAuthenticationNotifications With {
                .AuthenticationFailed = AddressOf OnAuthenticationFailed
            }
        })
    End Sub

    Private Function OnAuthenticationFailed(ByVal context As AuthenticationFailedNotification(Of OpenIdConnectMessage, OpenIdConnectAuthenticationOptions)) As Task
        context.HandleResponse()
        context.Response.Redirect("/?errormessage=" & context.Exception.Message)
        Return Task.FromResult(0)
    End Function
End Class

これは、ダッシュボードページでサインインしているユーザーを取得するために使用しているコードです

VB
Dim name As String = ""

       If HttpContext.Current.GetOwinContext().Authentication.User.Identity.IsAuthenticated = True Then
           name = HttpContext.Current.GetOwinContext().Authentication.User.Identity.Name
       End If

私が試したこと:

web.configでWindows認証を無効にしようとしましたが、ユーザー名は空の文字列のままです

解決策 1

Microsoft のドキュメントと Owin の使用は、次のいくつかを確認することを提案しています。答えはここにあるかもしれないと信じています。

1. 必要な NuGet パッケージが正しくインストールされていること、および OWIN および Azure AD 認証に使用できることを確認します。

2. Web.config ファイルで Azure AD 構成を確認します。 ida:ClientId、ida:RedirectUri、ida:Tenant、および ida:Authority の値が Web.config ファイルの appSettings セクションで正しく構成されていることを確認します。

3. Azure AD アプリの登録に正しいリダイレクト URI が登録されていることを確認します。 Azure AD アプリの登録で構成されたリダイレクト URI は、Web.config ファイルで指定された ida:RedirectUri 値と一致する必要があります。

4. 必要なミドルウェアが Startup.vb ファイルの app.UseCookieAuthentication 構成および app.UseOpenIdConnectAuthentication 構成で正しく構成されていることを確認します。

5. Azure AD アプリの登録で適切なアクセス許可が構成されていることを確認します。 構成されたアクセス許可は、OpenIdConnectAuthenticationOptions の OpenIdConnectScope プロパティと一致する必要があります。

解決策 2

問題の根本原因はわかりませんが、別の方法を考え出しました。それは、OWIN によって公開されている Claims オブジェクトを使用してユーザー名を取得するというものです。

If HttpContext.Current.GetOwinContext().Authentication.User.Identity.IsAuthenticated = True Then
           name = HttpContext.Current.GetOwinContext().Authentication.User.Claims.Where(Function(x) x.Type = "preferred_username").Single.Value.ToString
End If

コメント

タイトルとURLをコピーしました