【发布时间】:2021-03-02 08:39:24
【问题描述】:
我有一个使用我们组织的 CAS 服务器进行身份验证的 Web 应用程序。我目前正在为此应用程序开发与 DocuSign 的集成。用户将首先访问我们的站点并使用 CAS 登录。然后,他们可以进入应用程序的 DocuSign 区域,登录 DocuSign,然后执行一些与 DocuSign API 相关的功能。这些部分中的每一个都可以在我的应用程序中正常工作。
我当前的问题是我无法同时访问 HttpContext 中的两个身份。我需要 CAS 身份来确定用户行为和对某些功能的访问。我需要 DocuSign 身份来获取启用 API 调用所需的值。在 Startup.cs 中
services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)
.AddCookie(options =>
{
options.LoginPath = new PathString("/Account/Login");
})
.AddCAS(options =>
{
options.CasServerUrlBase = Configuration["CasBaseUrl"];
options.SignInScheme = CookieAuthenticationDefaults.AuthenticationScheme;
})
.AddOAuth("DocuSign", options ->
{
//necessary DocuSign options
});
我有一个 HomeController,它使用 Authorize 属性并且正确地需要 CAS 才能访问。我可以从 CAS 身份正确访问声明。我有一个 DocusignController,我在其中使用 Authorize(AuthenticationSchemes = "DocuSign")。应用于此控制器的 ActionFilter 表明 DocuSign 身份正在正确通过。不幸的是,没有附加 CAS 身份,所以我无法检查管理员权限等内容。我检查了 cookie,发现当我在不同的身份验证方案之间切换时,.AspNetCore.Cookies 值发生了变化。
解决方案的一个尝试是更改 DocusignController 以将 Authorize(AuthenticationSchemes = "DocuSign, CAS" 作为其属性。这似乎是两个方案的“或”而不是“与”。如果 CAS 是最新的方案,那么 CAS 标识就是在我的 ActionFilter 中看到的标识。DocuSign 也是如此。
另一个尝试是创建我自己的 AuthenticationHandler 来组合这两个身份。附加到上面的 AddAuthentication:
.AddScheme<CombinedSchemeOptions, CombinedHandler>
("Combined", op => { });
然后,在这个 CombinedHandler 中:
protected async override Task<AuthenticateResult> HandleAuthenticateAsync()
{
var CasResult = await Context.AuthenticateAsync("CAS");
if(CasResult?.Principal != null)
{
principal.AddIdentities(CasResult.Principal.Identities);
}
var DSResult = await Context.AuthenticateAsync("DocuSign");
if(DSResult?.Principal != null)
{
principal.AddIdentities(DSResult.Principal.Identities);
}
var ticket = new AuthenticationTicket(principal, "Combined");
return AuthenticateResult.Success(ticket);
}
这似乎与以前的行为方式相同。我最近使用的方案,在进入组合方案后,将给出一个带有标识的成功结果,而另一个结果将返回一个失败的结果。
我可以在 HttpContext.User 中同时拥有这两个身份吗?否则我是否可以将来自两个身份的声明合并为一个并将其传递?
【问题讨论】:
标签: authentication docusignapi claims-based-identity