提问人:Rui Silva 提问时间:9/29/2023 更新时间:9/29/2023 访问量:52
为什么 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]
问:
为什么 IdentityModel OidcClient 浏览器 InvokeAsync 打开的浏览器不使用 iPad (iOS) 中可用的所有屏幕
我们正在使用最新版本的 Visual Studio 2022 在 MAUI 中开发此功能
如您所见,在Android平板电脑中,浏览器使用所有可用空间。
即使在 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;
}
}
}
答:
1赞
Gary Archer
9/29/2023
#1
这些是集成的系统浏览器,在 Android 或 iOS 中调用。使用它们会将用户凭据保留在应用外部。根据 RFC8252 的说法,这是一种最佳实践。但是,您将无法更改外观 - 使用此类登录的其他应用程序(例如 gmail)也无法更改。Chrome Custom Tab
ASWebAuthenticationSessionWindow
评论