我们已经为所有用户实施了使用 ActiveDirectory 的 AWS SSO 身份验证(企业方面)。我们使用多个AWS子账户,以便ActiveDirectory用户可以根据AD组与AWS策略的关联,使用其AD凭证连接到不同的AWS子账户。这一切都运行得很好,但是,我不清楚如何正确实施以下授权。我们的一些帐户具有 S3 存储桶,这些存储桶应该可供所有通过 SSO 验证的用户使用,而不考虑用户访问权限。组织它的正确方法是什么?
我有一个 Rails API 和一个用 React 编写的客户端,嵌入到网站 A 中。我想使用单点登录,以便登录网站 A 并访问我的 React 应用程序的用户自动登录到 API。我使用 Devise 来管理用户,使用 Doorkeeper 来处理 OAuth2。
这是想要的场景:
用户登录到作为提供商的网站 A
用户转到React应用程序(嵌入在网站A中),一些用户信息由网站A传递到React应用程序
如果用户不知道 Rails API,请检查提供商是否为网站 A 并通过 Devise 存储用户
从 API 获取该用户的访问令牌和用户信息并发回 React App
我无法添加到网站 A 的路由,因此无法安装常用的 OAuth2 流程。
我的想法是将识别用户的签名从网站 A 传递到 React 应用程序,并将其发送到 API 以对用户进行身份验证。我尝试使用doorkeeper-grants_assertion gem,但我无法解决这个问题。
在这种情况下,我应该为用户使用哪种授权流程?如何将此策略集成到omniauth 中?
任何帮助将非常感激。
我正在开发一个 asp.net core 2.1 项目,其中安装了身份服务器 4,用户使用实体框架存储在 SQL 数据库中。Web 项目有一个登录页面和登录成功后的仪表板。
请在 Startup.cs 中找到以下代码,
public class Startup
{
public Startup(IConfiguration configuration)
{
Configuration = configuration;
}
public IConfiguration Configuration { get; }
// This method gets called by the runtime. Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services)
{
string connectionString = Configuration.GetConnectionString("DefaultConnection");
var migrationsAssembly = typeof(Startup).GetTypeInfo().Assembly.GetName().Name;
services.AddMvc();
services.AddDbContext<ApplicationDbContext>(builder =>
builder.UseSqlServer(connectionString, sqlOptions => sqlOptions.MigrationsAssembly(migrationsAssembly)));
services.AddDbContext<SingleSignOn_dbContext>(builder =>
builder.UseSqlServer(connectionString));
services.AddIdentity<IdentityUser, IdentityRole>()
.AddEntityFrameworkStores<ApplicationDbContext>();
services.AddIdentityServer(options =>
{
options.UserInteraction.LoginUrl = "/Master/Login"; // …Run Code Online (Sandbox Code Playgroud) 我有一个工作的 c#/dotnet Windows 桌面应用程序,它通过访问我的 Web 应用程序中的各种 Web 服务来完成其工作。当桌面应用程序启动时,它会提示用户输入用户名/密码,然后点击我的登录 Web 服务,该服务返回一个会话令牌。
我有一个拥有许多用户的大型组织客户。该客户希望直接从他们的域控制器为我的组合桌面/Web 应用程序提供身份验证/授权。他们想要单点登录,因此我的桌面应用程序不会提示用户输入用户名和密码。
我的桌面应用程序如何从 Windows(可能从用户的安全主体对象)检索可用的身份验证/授权令牌?我的 Web 应用程序如何验证该令牌,以便它可以信任桌面应用程序并向其发送会话令牌?
(我的 Web 应用程序在我的环境中运行,而不是在客户的域中运行。)
对于纯 Web 应用程序客户,我使用 SAML2 和 Active Directory/联合身份验证服务成功地做到了这一点。SAML2 舞蹈让我的用户浏览器向客户的 AD/FS 服务器发布请求,然后将签名的响应发布回我的 Web 应用程序。
但我不知道如何从桌面应用程序干净地完成它。有什么智慧吗?
authentication desktop-application ldap active-directory single-sign-on
我正在开发一个小 WPF 应用程序,该应用程序应该从 MS Graph API 查询一些数据。我想使用 SSO,这样用户就不必单独登录应用程序。
该应用程序在加入 Azure AD 的设备上运行。该用户是AADC同步的AD用户。AAD 租户与 ADFS 联合。用户使用 Hello for Business (PIN) 或密码进行身份验证。由此产生的问题是相同的。
我可以确认用户通过以下方式获得了 PRT:
dsregcmd /status
AzureAdPrt: YES
Run Code Online (Sandbox Code Playgroud)
如果重要的话:Azure AD 中的应用程序注册设置为“将应用程序视为公共客户端”。并配置以下重定向 URI:
根据我找到的示例,我使用以下代码来尝试获取访问令牌。但是该GetAccountsAsync()方法不会返回任何用户,也不会引发任何错误或异常。
谁能告诉我,我在这里缺少什么?
任何帮助将非常感激!
PS:当我使用“交互式身份验证”尝试此操作时,效果很好。
public GraphAuthProvider(string appId, string tenantId, string[] scopes)
{
_scopes = scopes;
try
{
_msalClient = PublicClientApplicationBuilder
.Create(appId)
.WithAuthority(AadAuthorityAudience.AzureAdMyOrg, true)
.WithTenantId(tenantId)
.Build();
}
catch (Exception exception)
{
_log.Error(exception.Message);
_log.Error(exception.StackTrace);
throw;
}
}
public async Task<string> GetAccessToken()
{
_log.Info("Starting 'GetAccessToken'...");
var accounts …Run Code Online (Sandbox Code Playgroud) c# single-sign-on azure-active-directory azure-ad-graph-api azure-ad-msal
我希望能够使身份验证流程中用户的任何操作令牌无效。
该场景是用户发送重置密码并收到带有关联操作令牌的电子邮件。然后,用户发送另一个重置密码并收到另一封带有不同操作令牌的电子邮件。对于第一个操作令牌到期时间的长度,用户可以利用两封电子邮件中的链接 - 但是我希望能够在我的自定义重置密码身份验证流程中识别出用户正在请求重复的操作请求并使他们之前的操作无效操作令牌,以便只有最新的重置密码链接才有效。
我一直在查看以下对象,但没有找到与所有用户活动关联的操作令牌存储,而不仅仅是与当前经过身份验证的会话关联。
AuthenticationFlowContext context;
List<UserSessionModel> sessions = context.getSession().sessions().getUserSessions(context.getRealm(), user);
RootAuthenticationSessionModel parentSessions = context.getAuthenticationSession().getParentSession();
ActionTokenStoreProvider actionTokenStore = session.getProvider(ActionTokenStoreProvider.class);
Run Code Online (Sandbox Code Playgroud)
提前致谢。
Snowflake 配置为用于 SSO 的 IDP/SAML 2.0。我正在使用 DBEAVER 连接到雪花。
我可以使用 Snowflake 身份验证进行连接,因此这不是驱动程序配置问题。
我不知道如何配置使用单点登录的 Snowflake。在 Dbeaver 连接设置中,我看到一个名为“externalbrowser”的设置,但我没有看到我在哪里放置了带有 Snowflake 主机 IDP 的 SSO 页面的 URL。
我在 Kibana (docker.elastic.co/kibana/kibana) 上使用带有 keycloak (docker.io/jboss/keycloak:11.0.2) 的 Gatekeeper (quay.io/keycloak/keycloak-gatekeeper:10.0.0) 进行 SSO -oss:7.10.1)
我的网守配置:
discovery-url: http://{{ index .Values.gatekeeper.config "keycloak-url" }}/auth/realms/{{ .Values.gatekeeper.config.realm }}
skip-openid-provider-tls-verify: true
client-id: {{ index .Values.gatekeeper.config "client-id" }}
client-secret: {{ index .Values.gatekeeper.config "client-secret" }}
listen: :3000
enable-refresh-tokens: true
enable-default-deny: true
enable-session-cookies: true
tls-cert:
tls-private-key:
redirection-url: http://{{ index .Values.gatekeeper.config "redirection-url" }}:{{ .Values.service.nodePort }}
secure-cookie: false
encryption-key: {{ index .Values.gatekeeper.config "encryption-key" }}
upstream-url: http://127.0.0.1:5601/
forbidden-page: /html/access-forbidden.html
upstream-keepalives: true
resources:
- uri: /*
Run Code Online (Sandbox Code Playgroud)
我能够进入 keycloak 登录页面,但在成功登录后(并且在 Kibana 加载程序完成加载后),我收到一个错误页面:
从 kibana 日志中我看到:
{"type":"log","@timestamp":"2020-12-19T15:50:58Z","tags":["debug","connection","econnreset"],"pid":8,"message":"ECONNRESET: …Run Code Online (Sandbox Code Playgroud) single-sign-on econnreset kibana keycloak keycloak-gatekeeper
当新的浏览器会话启动时,多个选项卡试图同时打开“安全服务器”(我们的 Oauth2 机密客户端)上的多个链接,OAuth2 身份验证代码流中基于 cookie 的会话和状态参数处理的性质会暴露出一个问题。
当浏览器启动时,它会丢弃所有以前的会话 cookie。在崩溃恢复的情况下,浏览器可以一次打开多个选项卡,或者用户可以从书签文件夹或历史记录中一次打开多个选项卡。
在这种情况下,所有选项卡将同时向 Secure Server 发送未经身份验证的请求。每个请求将启动一个新会话和一个新的身份验证代码流,以及新的状态参数,这些参数将保存在此会话中。
所有 Secure Server 的重定向到身份提供商的响应都将带有一个名称相同但值不同的会话 cookie。它们在浏览器中会互相覆盖,浏览器只保留最后一个作为Session ID。
每个选项卡将继续沿着授权代码流程到达身份提供商登录页面并返回安全服务器,具有不同的状态参数,但具有相同的会话 cookie(由最后一个选项卡设置)。
这些状态参数保存在现在丢失的会话中,无法验证。禁止状态参数验证失败,并发出 403 错误。
结果是除了最后一个选项卡之外的所有选项卡都以 403 页面结束。
是否有任何已知的做法可以处理这个问题?
谢谢
众所周知,WebKit 的 ITP和第三方 cookie阻止正在阻止常见的 SSO 技术正常工作。当用户自动登录到新访问的域时,这尤其与 SSO 的所谓静默登录功能相关,该域连接到她已经通过身份验证的某个身份验证服务器(具有活动的“全局”会话)。我相信这通常是使用隐藏的 iframe 和后消息来实现的。
看起来主要的 IAM 提供商已经屈服于这些障碍,只提供有限的功能。例如,Stack Exchange 门户不仅不支持静默登录,而且当您显式单击登录按钮时甚至无法恢复其他门户上的活动会话:
AskUbuntu 无法自动恢复 StackOverflow 上的活动会话。
所以,我的问题是:
1)。实际上是否有可能在实现 SSO(尤其是静默登录功能)时克服这些限制,而无需将整个浏览器窗口重定向到身份验证服务器?是否可以使用 XHR + CORS 来实现此目的?或者也许其他一些存储机制(例如 LocalStorage、Cache API、Service Workers 等)可以在禁用 cookie 的情况下保留会话?
2)。Google 如何通过 google.com/youtube.com 域解决此问题?看起来他们确实在恢复全局会话时重新加载整个应用程序,但只有当用户实际使用 Google 登录时才会发生这种情况。如果用户未登录,YouTube 不会自行重新加载。他们如何检测用户是否确实获得了全局会话?
single-sign-on ×10
c# ×2
keycloak ×2
amazon-s3 ×1
asp.net-core ×1
asp.net-mvc ×1
browser-tab ×1
cookies ×1
cross-domain ×1
dbeaver ×1
doorkeeper ×1
econnreset ×1
kibana ×1
ldap ×1
oauth ×1
reactjs ×1
security ×1
snowflake-cloud-data-platform ×1
state ×1
token ×1