为什么 IdentityModel OidcClient 浏览器 InvokeAsync 打开的浏览器不使用 iPad (iOS) 中提供的所有屏幕 [MAUI]

Why the browser opened by IdentityModel OidcClient Browser InvokeAsync does not use all the screen available in iPad (iOS) [MAUI]

提问人:Rui Silva 提问时间:9/29/2023 更新时间:9/29/2023 访问量:52

问:

为什么 IdentityModel OidcClient 浏览器 InvokeAsync 打开的浏览器不使用 iPad (iOS) 中可用的所有屏幕

我们正在使用最新版本的 Visual Studio 2022 在 MAUI 中开发此功能

它在 iPad 中的外观

如您所见,在Android平板电脑中,浏览器使用所有可用空间。

它在 Android 平板电脑中的外观

即使在 iPhone 中,浏览器也会使用所有可用空间

它在 iPhone 中的外观

我们用于进行身份验证的代码如下。

我们希望 iPad 中的行为与 iPhone 中的行为相似。

有什么想法吗?

public async Task<LoginSession> LoginAsync()
    {
        List<KeyValuePair<string, string>> parameters = new()
        {
            new KeyValuePair<string, string>(OidcConstants.AuthorizeRequest.ResponseType, OidcConstants.ResponseTypes.IdTokenToken),
            new KeyValuePair<string, string>(OidcConstants.AuthorizeRequest.Nonce, Guid.NewGuid().ToString("N"))
        };
    
        AuthorizeState state = await oidcClient.PrepareLoginAsync(new Parameters(parameters));
    
        state.StartUrl = state.StartUrl.Replace("response_type=code&", "");
    
        var request = new LoginRequest();
    
        var browserOptions = new BrowserOptions(state.StartUrl, options.RedirectUri)
        {
            Timeout = TimeSpan.FromSeconds(request.BrowserTimeout),
            DisplayMode = request.BrowserDisplayMode
        };
    
        var browserResult = await options.Browser.InvokeAsync(browserOptions);
    
        string browserResponse = string.Empty;
        string Error = string.Empty;
        string ErrorDescription = string.Empty;
    
        if (browserResult.ResultType == BrowserResultType.Success)
            browserResponse = browserResult.Response;
        else
        {
            Error = browserResult.Error ?? browserResult.ResultType.ToString();
            ErrorDescription = browserResult.ErrorDescription;
        }
    
        if (!string.IsNullOrEmpty(browserResponse))
        {
            var url = new Uri(browserResponse);
    
            string queryString = url.Query;
            var queryParse = HttpUtility.ParseQueryString(queryString);
            var queryDictionary = queryParse.ToDictionary();
            var loginSession = queryDictionary.ToObject<LoginSession>();
            //loginSession.oidcClient = oidcClient;
            //loginSession.options = options;
    
            return loginSession;
        }
    
        return new LoginSession
        {
            Error = Error,
            ErrorDescription = ErrorDescription
        };
    }

我们已经查看了浏览器选项中可用的选项,但没有人可以提供帮助:

// Copyright (c) Brock Allen & Dominick Baier. All rights reserved.
// Licensed under the Apache License, Version 2.0. See LICENSE in the project root for license information.

using System;

namespace IdentityModel.OidcClient.Browser
{
/// \<summary\>
/// Options for the browser used for login.
/// \</summary\>
public class BrowserOptions
{
/// \<summary\>
/// Gets the start URL.
/// \</summary\>
/// \<value\>
/// The start URL.
/// \</value\>
public string StartUrl { get; }

        /// <summary>
        /// Gets the end URL.
        /// </summary>
        /// <value>
        /// The end URL.
        /// </value>
        public string EndUrl { get; }
    
        /// <summary>
        /// Gets or sets the browser display mode.
        /// </summary>
        /// <value>
        /// The display mode.
        /// </value>
        public DisplayMode DisplayMode { get; set; } = DisplayMode.Visible;
    
        /// <summary>
        /// Gets or sets the browser timeout.
        /// </summary>
        /// <value>
        /// The timeout.
        /// </value>
        public TimeSpan Timeout { get; set; } = TimeSpan.FromMinutes(5);
    
        /// <summary>
        /// Initializes a new instance of the <see cref="BrowserOptions"/> class.
        /// </summary>
        /// <param name="startUrl">The start URL.</param>
        /// <param name="endUrl">The end URL.</param>
        public BrowserOptions(string startUrl, string endUrl)
        {
            StartUrl = startUrl;
            EndUrl = endUrl;
        }
    }

}
iOS iPhone iPad OpenID-Connect 毛伊岛

评论


答:

1赞 Gary Archer 9/29/2023 #1

这些是集成的系统浏览器,在 Android 或 iOS 中调用。使用它们会将用户凭据保留在应用外部。根据 RFC8252 的说法,这是一种最佳实践。但是,您将无法更改外观 - 使用此类登录的其他应用程序(例如 gmail)也无法更改。Chrome Custom TabASWebAuthenticationSessionWindow