- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我认为我的主要问题是我应该使用哪种身份验证流程 - 代表流程还是隐式授权流程?但是,我在 Startup.cs
中设置的身份验证和授权可能是错误的,而且我还很遥远,所以如果是这样,我深表歉意。
我在 Azure 中有一个现有的 Angular SPA,并且一个也在 Azure 中运行的 Net Framework API。
Web API 已移植到 Net Core 3.1。
在我们的 Azure 目录中,我有两个注册的应用程序。一个用于 API,另一个用于 SPA。我已在 WEB API 中的授权客户端下添加了 SPA 客户端 ID。
值得注意的是,应用程序服务实际上运行在不同的目录中(我认为这很好,但只是提一下)
以下是 Azure AD 中的相关身份验证/授权设置。
private void ConfigureAzureAD(IServiceCollection services, IMvcBuilder mvcBuilder)
{
services.AddAuthentication(AzureADDefaults.AuthenticationScheme)
.AddAzureAD(options => Configuration.Bind("AzureAd", options));
services.Configure<OpenIdConnectOptions>(AzureADDefaults.OpenIdScheme, options =>
{
options.Authority = options.Authority + "/v2.0/";
options.TokenValidationParameters.ValidateIssuer = true;
});
mvcBuilder.AddMvcOptions(options =>
{
var policy = new AuthorizationPolicyBuilder().
RequireAuthenticatedUser().
Build();
options.Filters.Add(new AuthorizeFilter(policy));
}).
SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseResponseCaching();
}
app.UseStaticFiles();
app.UseCors(CORS_POLICY);
if (UseAzureAD)
{
app.UseHttpsRedirection();
}
app.UseRouting();
app.UseCookiePolicy();
app.UseAuthorization();
app.UseAuthentication();
app.UseMvc();
}
我可以直接成功使用该 API 并且它进行了身份验证。
SPA 正在使用 Angular ADAL。如果我没读错的话,它将不适用于 Microsoft Identity V2 端点。 - 我们仍然需要升级到 MSAL,尽管我仍然无法理解最终的身份验证流程(我认为这是我的主要问题)。
目前,如果我点击 SPA,它将仅使用当前的 ADAL 配置进行身份验证,但当它点击 API 时,会被重定向到 https://login.microsoftonline.com/{TenantId}/oauth2/v2.0/authorize?
和 ID token 。
它卡在重定向上,并且是 CORS 错误,因为源为空。我知道这是预期的,因为 SPA 未正确配置。
API 确实调用 MS Graph API 来获取用户的组(但使用客户端 ID 和客户端 key 来获取访问 token 来调用 MS Graph),所以我不认为这意味着我需要使用代表流程(我确实看到了这篇文章 Authenticating against Microsoft Graph with SPA and then using token in Web API )?
我看过这个例子https://github.com/Azure-Samples/ms-identity-javascript-angular-spa-aspnetcore-webapi隐式拨款流量。
我确实注意到该示例中的身份验证方案是 JwtBearerDefualts
,这很有意义,因为 ID token 是 JWT,因此这让我质疑我的 API 启动配置。
这里是在 API 中调用 MS Graph 的部分,可能需要它来最好地回答我应该使用两个流程中的哪一个(它再次获取带有客户端 key 的访问 token )。
private async Task<IReadOnlyCollection<string>> LoadReportGroupsCurrentUserCanRead()
{
var objectID = claimsPrincipal
.Claims
.FirstOrDefault(c => c.Type == "http://schemas.microsoft.com/identity/claims/objectidentifier")
?.Value;
var graphServiceClient = await GetGraphServiceClient();
var groups = await graphServiceClient
.Groups
.Request()
.GetAsync();
var memberGroups = await graphServiceClient
.Users[objectID]
.GetMemberGroups(true)
.Request()
.PostAsync();
return memberGroups.Select(mg => groups.SingleOrDefault(g => g.Id == mg))
.Where(g => g?.DisplayName?.EndsWith(" Report Group", StringComparison.InvariantCultureIgnoreCase) == true)
.Select(g => g.Description)
.Where(name => !string.IsNullOrWhiteSpace(name))
.ToArray();
}
private async Task<GraphServiceClient> GetGraphServiceClient()
{
string authority = new Uri(microsoftLogin, tenantID).AbsoluteUri;
var authenticationContext = new AuthenticationContext(authority);
var clientCredential = new ClientCredential(clientID, clientSecret);
var authenticationResult = await authenticationContext.AcquireTokenAsync("https://graph.microsoft.com", clientCredential);
var authProvider = new DelegateAuthenticationProvider(requestMessage =>
{
requestMessage.Headers.Authorization = new AuthenticationHeaderValue("bearer", authenticationResult.AccessToken);
return Task.CompletedTask;
});
return new GraphServiceClient(authProvider);
}
最后,我认为我们的 SPA 使用的 Angular 版本不支持 Angular MSAL。我可以只使用 Vanilla MSAL JS(我们现在没有时间升级 Angular)吗?
最佳答案
您应该使用implicit flow和 msal-angular 。它支持从 4 到 9 的 Angular。此外,我不建议在 Angular 中使用普通库,除非别无选择。
ADAL 已弃用,并且不支持融合应用程序模型(工作+个人帐户),因此您需要迁移到 MSAL。
关注Create web APIs with ASP.NET Core和 Migrate from ASP.NET Core 2.2 to 3.0删除这样的代码:
mvcBuilder.AddMvcOptions(options =>
{
var policy = new AuthorizationPolicyBuilder().
RequireAuthenticatedUser().
Build();
options.Filters.Add(new AuthorizeFilter(policy));
})
而是将您的 Controller 设置为 Controller and decorate them with ApiController attribute .
还有这个,因为它是 .NET 3.1:
.SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
您的 MS Graph 身份验证正在通过 client credentials 进行身份验证这是当前应用程序架构的常见方法。前提是您没有添加太多highly privileged permissions那么应该没问题。
关于azure - 使用 Microsoft Identity 通过 Core 3.1 Web API 进行客户端 SPA 身份验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61684410/
我正在看的是在另一个 React 微前端中有一个有角度的微前端,这是我们可以通过 single-spa 实现的吗 最佳答案 是的,这可以通过两种方式完成。这取决于您的应用程序使用的框架。 选项 1:跨
总结:如何在不使用繁重的 JS 框架的情况下处理 PWA 中的导航、历史记录和深度链接? 在领导团队将现有的购物网站从 Angular 1 SPA 转换为多页面应用程序 (MPA) PWA 时,我遇到
我正在尝试使用 Angular.js 和 Express.js 创建 Node.js 应用程序。 我正在做的是使用此代码将客户名称和地址添加到列表(随机)。 var mylist = new gene
关闭。这个问题是opinion-based 。目前不接受答案。 想要改进这个问题吗?更新问题,以便 editing this post 可以用事实和引文来回答它。 . 已关闭 8 年前。 Improv
所以我在 Laravel 5.3 和 Vue 2 中开发一个网站/网络应用程序。SEO 很重要,所以我想在 Laravel + Blade 中保留网站的前端/可抓取部分,并且只保留一些不必要的小部分在
我设置了一个单页应用程序,它使用 Controller (用 PHP 编写)从 API 获取数据。到目前为止,我没有遇到任何问题,数据填充表,在选择表元素时它会使用新的 url 和部分数据(主要是 I
因此,我一直在尝试找出有关如何在 SPA 应用中处理授权(而不是身份验证)的最佳实践。 假设我有一个带有 api 后端的客户端 MVC(Angular、vuejs 等),我们如何管理应用程序的使用授权
SPA 的缺点当然是初始加载时间。 例如,我用 Durandal 创建了 AskACarPro.com。 它目前在加载时有一个“加载”屏幕。但我在想也许这是一个坏主意。它让我想起了一个全闪存网站——漂
我最近一直在阅读有关 SPA 以及它有多好的内容。 我想知道是否有人可以告诉我什么时候应该使用,或者什么时候不应该像常规 MVC 一样使用 SPA 最佳答案 MVC(Rails、MVC4)的工具更加成
基本设置:由Apache 2.4提供的Angular 1.5 SPA由REST api支持,Apache 2.4也提供了REST API。 我已经阅读了在服务器上更改了一些应用程序代码后可以使SPA更
在典型的单页应用程序(SPA,例如:React)中,整个代码包都提供给客户端。这包括应用程序的私有(private)组件,这些组件通常受到客户端授权机制的保护(例如,检查身份验证 token 是否已设
我想单独托管我的 应用程序和 网站 .层次结构如下: example.com - 网站托管在 DigitalOcean example.com/* - SPA 托管在 Firebase Hosting
我正在寻找可重复使用的解决方案,以解决用户执行的某些操作在完成之前可能需要用户进一步确认的问题。 我正在使用 React 前端和 WebAPI 后端开发应用程序。 假设用户正在发起资金转账,并假设我们
我有一个像这样的网站 http://domain/?key=32dxzQW 其中 key 是从每个用户的其他站点自动生成的 我需要知道的是访问量最大的部分,所以我正在考虑使用 GA,并且由于我的网页是
我真的很喜欢GunDb的概念,并且了解如何单独在客户端编写。 现在我使用来自 Github 的 Create-React-App。 有人知道 GunDb 的服务器端吗? 和一个 View [React
假设 ABC 公司有两个团队开发两个 SPA 应用程序:app1、app2 每个应用程序都有自己的 index.html 和关联的静态资源,例如: build / 索引.html 主.js 这是从:h
我一直在使用 AngularJS 开发 SPA,并将用户数据存储在 Angular Value 服务中,但我对此感到不舒服,主要是因为 Angular Value 不在浏览器选项卡之间共享。因此,如果
假设 ABC 公司有两个团队开发两个 SPA 应用程序:app1、app2 每个应用程序都有自己的 index.html 和关联的静态资源,例如: build / 索引.html 主.js 这是从:h
因此,我使用 Gorilla/Mux 在 Go 中设置了我的 SPA,但我想在不同的路由上运行它,这样我就可以将我的两个 Kubernetes 服务连接在一起(2 个不同的 SPA)。 难道我必须将我
我正在创建一个单页应用程序。我试图在 sql 中选择一个表并在字段中搜索特定日期 Date_Due,然后确保另一个字段 Date_Complete 为空。我试图弄清楚如何让隐藏字段填充查询中的 cfp
我是一名优秀的程序员,十分优秀!