我有以下几点:
application
所有这些都运行在Azure应用程序服务中。我开发的web应用程序和api应用程序合作得很好。web应用程序将auth承载令牌传递给API,API使用Aspnetcore.Okta中间件对其进行验证。
然而,我现在需要把我的Nopcommerce应用程序纳入其中。我花了3天时间尝试构建一个插件--即使是一个基本上什么也不做的插件,除了麻烦之外,什么都没有。我用了自己的“官方”模板,它有自己的问题。所以我决定把Facebook外部的auth插件,然后开始编辑它。至少现在我有了一些我可以实际工作的东西。
这是我被困的地方..。我可以继续使用Okta中间件并完成它吗?我指的是以下步骤:
Challenge
G 223
我的想法是,如果机器键在两个应用程序上都是相同的,那么cookie应该可以正常工作。
您认为这是最好的方法吗,还是应该按照1-4中的相同步骤,除了4之后,将用户发送回Nopcomm站点,其中包含查询字符串中的令牌,然后在Nopcomm端手动验证它?
发布于 2020-01-23 14:18:33
我想,到目前为止,我会分享我的测试结果,因为它揭示了一些我真的没有想到的事情。也许这些事情对你们大多数人来说都是显而易见的/众所周知的--但对我来说,它们确实是很棘手的。
我学到的第一件重要的事情是,你必须对你的应用程序问题的挑战类型有明确的认识。如果您正在自托管登录页面,则需要使用:
services.AddAuthentication(options =>
{
options.DefaultAuthenticateScheme = CookieAuthenticationDefaults.AuthenticationScheme;
options.DefaultSignInScheme = CookieAuthenticationDefaults.AuthenticationScheme;
options.DefaultChallengeScheme = CookieAuthenticationDefaults.AuthenticationScheme;
})如果您正在使用Okta (或其他openId提供程序)登录页面,则需要发出另一种类型的挑战:
builder.Services.AddAuthentication(options =>
{
options.DefaultAuthenticateScheme = CookieAuthenticationDefaults.AuthenticationScheme;
options.DefaultSignInScheme = CookieAuthenticationDefaults.AuthenticationScheme;
options.DefaultChallengeScheme = OpenIdConnectDefaults.AuthenticationScheme;
})我所了解到的是,如果您在OpenID核心应用程序中使用ASP.NET连接,并且您正在自托管登录页面,则流程类似于:
.AddCookie(options =>
{
options.LoginPath = new PathString("/Account/SignIn");
options.Cookie.Name = ".AspNet.SharedCookie";
})因此,我在这里学到的最大教训是:仅仅因为两个应用程序都使用相同的OpenID服务器,并不意味着它们可以轻松地共享auth/会话。为了使真正的SSO无缝地工作,他们还必须共享一个cookie。这就引出了我的第二个发现:在ASP.NET核心应用程序之间共享cookies。简短的说法是,你必须:
在两个应用程序b中,将cookie命名为相同的名称。使用IDataProtection接口将您的cookie密钥存储到两个应用程序都可以到达的地方(我选择了Azure)。确保这两个应用程序的cookie域是相同的。
因此,最终,这就是我的代码看起来像端到端(在每个应用程序的启动)。我仍然在处理一些特定于Nopcommerce的奇怪之处,但希望它们能在不久的将来得到解决。
var oktaMvcOptions = new OktaMvcOptions()
{
OktaDomain = oktaDomain,
ClientId = clientId,
ClientSecret = clientSecret,
Scope = new List<string> { "openid", "profile", "email", "address", "groups" },
AuthorizationServerId = authServerId,
GetClaimsFromUserInfoEndpoint = true
};
services.Configure<CookiePolicyOptions>(options =>
{
// This lambda determines whether user consent for non-essential cookies is needed for a given request.
options.CheckConsentNeeded = context => true;
options.MinimumSameSitePolicy = SameSiteMode.None;
});
CloudStorageAccount storageAccount = CloudStorageAccount.Parse(storageConnectionString);
CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient();
CloudBlobContainer container = blobClient.GetContainerReference(storageContainerName);
var blob = container.GetBlockBlobReference("somefilename.xml");
services.AddDataProtection().SetApplicationName("somesharedappname").PersistKeysToAzureBlobStorage(blob);
services.AddAuthentication(options =>
{
options.DefaultAuthenticateScheme = CookieAuthenticationDefaults.AuthenticationScheme;
options.DefaultSignInScheme = CookieAuthenticationDefaults.AuthenticationScheme;
options.DefaultChallengeScheme = CookieAuthenticationDefaults.AuthenticationScheme;
})
.AddCookie(options =>
{
options.LoginPath = new PathString("/Account/SignIn");
options.Cookie.Name = "somesharedcookiename";
})
.AddOktaMvc(oktaMvcOptions);我希望这能帮助那些在同样的问题上挣扎的人。如果有人能提出一个更好的机制来实现这一点,我很想听听你的想法和建议。
https://stackoverflow.com/questions/59842145
复制相似问题