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 在理论上是如何工作的?