Microsoft OpenIdConnect Owin 响应

Posted

技术标签:

【中文标题】Microsoft OpenIdConnect Owin 响应【英文标题】:Microsoft OpenIdConnect Owin Response 【发布时间】:2021-10-11 06:34:51 【问题描述】:

如果有一个非常明显的答案,我现在道歉!

我有一个简单的测试项目,可以让用户使用 openid connect 和 azure 登录。登录和注销工作。

我不知道如何阅读响应正文,以便确定登录用户是谁。

我猜我必须将某种异步处理程序添加到中间件以接收响应,但我找不到任何有关如何执行此操作的示例。我的代码在 VB 中,但我对 C# 中的示例很满意,但我找不到任何示例。

谁能给我一些例子来说明如何收集响应?

非常感谢, 迈克

我的代码如下。

signin.aspx

<%@ Page Title="" Language="VB" MasterPageFile="~/masterpage/MasterPage.master" AutoEventWireup="false" CodeFile="signin.aspx.vb" Inherits="signin" %>

<asp:Content ID="Content1" ContentPlaceHolderID="HeaderPlaceHolder" Runat="Server">
</asp:Content>
<asp:Content ID="Content2" ContentPlaceHolderID="FCKBodyTopPlaceHolder" Runat="Server">
</asp:Content>
<asp:Content ID="Content3" ContentPlaceHolderID="BodyPlaceHolder" Runat="Server">
    
         <form runat="server" >
              <div>
            <asp:Button runat="server" ID="btnSignIn" Text="Sign In" />

            <asp:Button runat="server" ID="btnSignOut" Text="Sign Out" />
                  </div>

             
             </form>
        
</asp:Content>

signin.aspx.vb

Imports System
Imports System.IO
Imports System.Web
Imports Microsoft.Owin
Imports Microsoft.Owin.Security
Imports Microsoft.Owin.Security.Cookies
Imports Microsoft.Owin.Security.OpenIdConnect
Partial Class signin
    Inherits System.Web.UI.Page

    Private Sub signin2_Load(sender As Object, e As EventArgs) Handles Me.Load
        If Not Request.IsAuthenticated Then
            btnSignIn.Visible = True
            btnSignOut.Visible = False
        Else
            btnSignIn.Visible = False
            btnSignOut.Visible = True
        End If

    End Sub

    Private Sub btnSignIn_Click(sender As Object, e As EventArgs) Handles btnSignIn.Click
        If Not Request.IsAuthenticated Then
            
                HttpContext.Current.GetOwinContext().Authentication.Challenge(New AuthenticationProperties, OpenIdConnectAuthenticationDefaults.AuthenticationType)
           
        End If
    End Sub

    Private Sub btnSignOut_Click(sender As Object, e As EventArgs) Handles btnSignOut.Click
        HttpContext.Current.GetOwinContext().Authentication.SignOut()
    End Sub
End Class

startup.vb

Imports System
Imports System.Threading.Tasks
Imports Microsoft.Owin
Imports Owin
Imports Microsoft.IdentityModel.Protocols.OpenIdConnect
Imports Microsoft.IdentityModel.Tokens
Imports Microsoft.Owin.Security
Imports Microsoft.Owin.Security.Cookies
Imports Microsoft.Owin.Security.OpenIdConnect
Imports Microsoft.Owin.Security.Notifications


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

        Public Sub Configuration(ByVal app As IAppBuilder)
            app.SetDefaultSignInAsAuthenticationType(CookieAuthenticationDefaults.AuthenticationType)
            app.UseCookieAuthentication(New CookieAuthenticationOptions())
            app.UseOpenIdConnectAuthentication(New OpenIdConnectAuthenticationOptions With 
                .ClientId = clientId,
                .Authority = authority,
                .RedirectUri = redirectUri,
                .PostLogoutRedirectUri = redirectUri,
                .Scope = OpenIdConnectScope.OpenIdProfile,
                .ResponseType = OpenIdConnectResponseType.IdToken,
                .ResponseMode = OpenIdConnectResponseMode.FormPost,
                .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
End Namespace

编辑: 添加索赔截图

【问题讨论】:

【参考方案1】:

使用 OpenID Connect,用户详细信息会在 Id-token 中返回,获取用户身份的最简单方法是查看 HttpContext.Current.User 对象。

您不应该尝试自己从标题中访问它。因为实际的令牌数据对您的浏览器永远不可见,而是由 OpenIDConnect 处理程序在后台检索。

【讨论】:

感谢您的建议。我刚刚尝试检查 HttpContext.Current.User.Identity.Name 的输出,但它返回空白。但是 httpcontext.current.user.Identity.IsAuthenticated 返回为真。会不会是我使用的 ResponseType 造成的? 如果它说您已通过身份验证,那么您在实现目标的道路上已经走了很长一段路。您可以粘贴您的 ID 令牌的样本副本以及与用户关联的声明样本。请参阅我刚刚在这里回答的问题中的图片***.com/questions/68682161 我确实觉得我在进步。我在原始帖子中添加了屏幕截图。不幸的是,问题似乎在于没有索赔。今天没时间了,周一继续调查。 不确定在旧的 ASP.NET 中如何做,但在 ASP.NET Core 中我会使用 var accessToken = await HttpContext.GetTokenAsync("access_token");您还可以使用各种事件处理程序来获取它(来自 OpenIDConnect auth owin 处理程序) 您还可以在 UseOpenIdConnectAuthentication 中设置“SaveToken=true”,然后令牌将保存在会话 cookie 中。看到这个问题***.com/questions/46319114/…

以上是关于Microsoft OpenIdConnect Owin 响应的主要内容,如果未能解决你的问题,请参考以下文章

cookie 过多 OpenIdConnect.nonce 导致错误页面“错误请求 - 请求太长”

ASP.NET Core 5 OpenIdConnect 身份验证 cookie 在理论上是如何工作的?

OpenID Connect - 在这种情况下是不是应该将 id 令牌发送到受保护的资源?

OpenIDConnect 响应类型混淆

验证 OpenIdConnect 配置

REACT.JS - 如何使用 react-openidconnect 调用登录