我已经成功创建了一个 AAD B2C 自定义策略,它调用了我的应用程序。
类似于可以在这里找到的内容:
在 Azure AD B2C 用户旅程中集成 REST API 声明交换作为对用户输入的验证
和这里:
<ClaimsProvider>
<DisplayName>XYZ API</DisplayName>
<TechnicalProfiles>
<TechnicalProfile Id="XYZ">
<DisplayName>XYZ</DisplayName>
<Protocol Name="Proprietary" Handler="Web.TPEngine.Providers.RestfulProvider, Web.TPEngine, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" />
<Metadata>
<Item Key="ServiceUrl">https://example.com/api/1.0/Users</Item>
<Item Key="AuthenticationType">ClientCertificate</Item>
<Item Key="SendClaimsIn">Body</Item>
</Metadata>
<CryptographicKeys>
<Key Id="ClientCertificate" StorageReferenceId="B2C_1A_XYZRestClientCertificate" />
</CryptographicKeys>
<InputClaims>
<InputClaim ClaimTypeReferenceId="givenName" PartnerClaimType="givenName" />
<InputClaim ClaimTypeReferenceId="surname" PartnerClaimType="surname" />
<InputClaim ClaimTypeReferenceId="displayName" PartnerClaimType="displayName" />
<InputClaim ClaimTypeReferenceId="objectId" PartnerClaimType="objectId" />
<InputClaim ClaimTypeReferenceId="email" PartnerClaimType="email" />
<InputClaim ClaimTypeReferenceId="otherMails" PartnerClaimType="otherMails" />
</InputClaims>
<OutputClaims>
</OutputClaims>
<UseTechnicalProfileForSessionManagement ReferenceId="SM-Noop" />
</TechnicalProfile>
</TechnicalProfiles>
</ClaimsProvider> …Run Code Online (Sandbox Code Playgroud) 我正在使用 MSAL 来获取访问令牌。它工作正常,我能够登录并检索我的 Active Directory 用户。
但是,当我在使用它访问 API 时遇到问题时,我注意到当我在https://jwt.io/检查令牌时,它显示无效签名。
这是一个问题吗?如果是这样,我该如何解决?
我正在尝试使用 Azure AD B2C 运行ASP.NET Core 2.1 Web 应用程序。我在经过大量研究(以及更多的试验和错误)之后运行了这个,因为文档中的说明有点偏离。
登录/注册过程使用项目设置向导期间的默认脚手架,以及新的Microsoft.AspNetCore.Authentication.AzureADB2C.UI Nuget,从而在启动过程中提供简化但“封闭式”的体验。
目前的问题是,我无法使用与“signin-oidc”不同的自定义回复 URL 来完成这项工作。我已经读过“signin-oidc”以某种方式嵌入到提供程序中,因此是默认设置。
我定义OnboardingController了一个Start操作,我希望用户在注册后登陆,所以我做了以下操作:
localhost:12345/Onboarding/Start有效。页面显示正确。"CallbackPath": "/signin-oidc"为"CallbackPath": "/Onboarding/Start"

C) 我转到租户并将应用程序的回复 URL 更改为localhost:12345/Onboarding/Start. 重要提示:与 ADB2C 示例和指南不同,您必须在回复 URL 后附加 signon-oidc 或自定义请求路径!本地主机:12345 还不够!

我可以确认身份验证有效:Microsoft.AspNetCore.Authentication.Cookies.CookieAuthenticationHandler:Information: AuthenticationScheme: AzureADB2CCookie 已登录。Microsoft.AspNetCore.Hosting.Internal.WebHost:Information: Request completed in 56.201ms
然后,当我在浏览器中手动导航到 /Onboarding/Start 时,我得到
远程身份验证错误:关联失败。
Microsoft.AspNetCore.Hosting.Internal.WebHost:Information: Request starting HTTP/1.1 GET http://localhost:12345/Onboarding/start
Microsoft.AspNetCore.Authentication.OpenIdConnect.OpenIdConnectHandler:Warning: .AspNetCore.Correlation. state property not found.
Microsoft.AspNetCore.Authentication.OpenIdConnect.OpenIdConnectHandler:Information: Error from …Run Code Online (Sandbox Code Playgroud) 我正在使用 MSAL 1.3 在我的 Angular 8 应用程序中对 Azure B2C 用户进行身份验证,该应用程序具有 .net 核心后端 API。一切都很好,除非用户未登录,当我们尝试在我的 webapi 中调用未受保护的端点以注册新用户时出现错误。调用是在服务类 (service.ts) 中进行的,我得到的错误是
MSAL 日志记录:2020 年 6 月 18 日星期四 16:21:19 GMT:2335b876-d867-4b1f-9d3f-d285caa0ee04-1.3.0-获取范围令牌时出错:https ://fabrikamb2c.onmicrosoft.com/helloapi/de .read ClientAuthError:需要用户登录。对于静默调用,请求必须包含 sid 或 login_hint mycomponent.component.ts:132 ClientAuthError: User login is required。对于无声调用,请求必须包含 sid 或 login_hint
它尝试访问的 API 已添加为,unprotectedResources并且 MSAL 不应尝试静默获取令牌并检查用户是否已登录。
我的 b2c 配置如下所示
import { Configuration } from 'msal';
import { MsalAngularConfiguration } from '@azure/msal-angular';
// this checks if the app is running on IE
export const isIE = window.navigator.userAgent.indexOf('MSIE ') …Run Code Online (Sandbox Code Playgroud) Google 的 Chrome 浏览器从 84.0.4147.89 更新到 84.0.4147.105 已破坏我们应用程序的隐身窗口中的 MSAL 登录(身份验证)。
为了验证我们的应用程序没有问题,我尝试在隐身浏览器中使用入门包登录 Azure AD B2C,并且看到了相同的行为。有人遇到过同样的问题吗?
过去很少有开发人员发布过类似的问题。但提供的解决方案没有帮助。 https://support.google.com/chrome/thread/38855209?hl=en
仅供参考:登录在 Chrome 常规浏览器和其他浏览器中按预期工作
入门包详细信息: https://github.com/Azure-Samples/active-directory-b2c-javascript-msal-singlepageapp
入门包有 msal 1.3.3 版本。前几天,1.3.4版本已经发布了,我也尝试了一下。我在隐身模式下 acquiretokensilent(CallApi) 期间看到错误,而在常规窗口中没有得到相同的异常
入门包和我们的应用程序之间的唯一区别是,我们在登录成功后立即调用 acquiretokensilent,但在入门包中,acquiretokensilent 是在单击按钮时调用的(CallApi)
您好,我正在学习使用 MSAL,但遇到了有线问题。我完全遵循了教程,并且正在使用示例代码。但我在App.xaml.cs中构建客户端时仍然遇到此异常:
microsoft.identity.client.msalclientException:应用程序无法访问应用程序发布者的 ios 钥匙串(团队 ID 为空)。这是为了在同一发布者的应用程序之间启用单点登录所必需的。这是ios配置问题。有关启用钥匙串访问的更多详细信息,请参阅 https://aka.ms/msal-net-enable-keychain-access 。
AuthenticationClient = PublicClientApplicationBuilder.Create(Constants.ClientId)
.WithIosKeychainSecurityGroup(Constants.IosKeychainSecurityGroups)
.WithB2CAuthority(Constants.AuthoritySignin)
.WithRedirectUri($"msal{Constants.ClientId}://auth")
.Build();
Run Code Online (Sandbox Code Playgroud)
相关设置如下:
信息.plist:
<key>CFBundleURLTypes</key>
<array>
<dict>
<key>CFBundleURLName</key>
<string>ADB2C Auth</string>
<key>CFBundleURLSchemes</key>
<array>
<string>msal....</string>
</array>
<key>CFBundleTypeRole</key>
<string>None</string>
</dict>
<dict>
<key>CFBundleURLName</key>
<string>URL Type 1</string>
</dict>
</array>
Run Code Online (Sandbox Code Playgroud)
Contants.cs 中的 ioskeychain:
// set to a unique value for your app, such as your bundle identifier. Used on iOS to share keychain access.
static readonly string iosKeychainSecurityGroup = "com.xamarin.adb2cauthorization";
Run Code Online (Sandbox Code Playgroud)
权利.plist:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC …Run Code Online (Sandbox Code Playgroud) xamarin.ios azure-active-directory xamarin.forms azure-ad-b2c azure-ad-msal
我想做的是在身份验证后添加声明。以下注册OnTokenValidation事件的示例并不能解决问题。该事件永远不会触发。
我正在使用Microsoft.Identity.WebAzure AD B2C 进行身份验证。那部分有效!如何使用 注册事件AddMicrosoftIdentityWebAppAuthentication?
services.AddMicrosoftIdentityWebAppAuthentication(Configuration, "AzureAdB2C")
.EnableTokenAcquisitionToCallDownstreamApi(new string[] {Configuration["DemoApi:ServiceScope"]})
.AddInMemoryTokenCaches();
services.Configure<OpenIdConnectOptions>(AzureADB2CDefaults.OpenIdScheme, options =>
{
options.Events = new OpenIdConnectEvents
{
OnTokenValidated = ctx =>
{
//query groups with graph api to get the role
// add claims
var claims = new List<Claim>
{
new Claim(ClaimTypes.Role, "superadmin")
};
var appIdentity = new ClaimsIdentity(claims);
ctx.Principal.AddIdentity(appIdentity);
return Task.CompletedTask;
},
};
});
Run Code Online (Sandbox Code Playgroud) 我正在开发 Xamarin.Forms 应用程序,并设置 Azure AD B2C 进行身份验证。我正在遵循官方教程。对于 Andorid,一切都完美无缺,但我在 iOS 项目上遇到了问题。
我已经设置了教程中提到的所有内容,但这还不够。在这篇文章中,它描述了您应该如何配置iOS Bundle Signing以引用自定义权利Entitlements.plist。否则你会得到这个错误:
Microsoft.Identity.Client.MsalClientException:应用程序无法访问应用程序发布者的 iOS 钥匙串(TeamId 为 null)。这是在同一发布者的应用程序之间启用单点登录所必需的。这是 iOS 配置问题。有关启用钥匙串访问的更多详细信息,请参阅 https://aka.ms/msal-net-enable-keychain-access 。
好吧,如果您使用模拟器执行此操作,则它不起作用,因为显然,您无法在使用模拟器时在 iOS 捆绑签名配置中设置任何自定义权利(此处注释)。
这是否意味着我无法在 iOS 模拟器中测试 Azure AD B2C?
编辑:如果您没有 Apple 开发者计划签名身份,您似乎无法设置自定义权利。这是否意味着如果没有注册 Apple 开发计划,我就无法在 iOS 模拟器中测试 Azure AD B2C?
谢谢!
我在我的应用程序中使用 azure b2c 注册策略(内置策略)。在那里,我们有三个字段。
就我而言,我想从用户流中删除此显示名称。但是一旦我删除它,在 B2C 中,用户的名称就是“未定义”。
有什么方法可以在不询问显示名称的情况下生成带有名字和姓氏的显示名称?
(我正在使用内置用户流程)
我一直在与 adb2c 斗争一段时间。特别是刷新流程。我正在使用最新版本msal-browser并且一切正常,刷新令牌效果很好。唯一的问题是令牌端点返回的refresh_token总是会在一天后过期。在这种情况下,用户只能登录一天,之后,用户将始终需要重新授权。这是端点的示例以及它在登录后直接返回的内容。(请注意,access_token为了测试目的,我已将过期时间设置为5 分钟)
端点:
https://{b2c_domain.onmicrosoft.com/{b2c_policy}/oauth2/v2.0/token
Run Code Online (Sandbox Code Playgroud)
回复:
{
"access_token": "{access_token_hidden}",
"id_token": "{id_token_hidden}",
"token_type": "Bearer",
"not_before": 1610023338,
"expires_in": 300,
"expires_on": 1610023638,
"resource": "{resource_hidden}",
"client_info": "{client_info}",
"scope": "https://{adb2c_domain_hidden}.onmicrosoft.com/api/user_impersonation",
"refresh_token": "{refresh_token_hidden}",
"refresh_token_expires_in": 86400
}
Run Code Online (Sandbox Code Playgroud)
当应用程序在某个时候尝试刷新令牌时,它将再次调用令牌端点。这是第二个响应的样子:
{
"access_token": "{access_token_hidden}",
"id_token": "{id_token_hidden}",
"token_type": "Bearer",
"not_before": 1610023891,
"expires_in": 300,
"expires_on": 1610024191,
"resource": "{resource_hidden}",
"client_info": "{client_info}",
"scope": "https://{adb2c_domain_hidden}.onmicrosoft.com/api/user_impersonation",
"refresh_token": "{refresh_token_hidden}",
"refresh_token_expires_in": 85846
}
Run Code Online (Sandbox Code Playgroud)
在refresh_token_expires_in不滚动。但这是可以理解的,用户不应始终保持登录状态。但是,在我的 adb2c 策略中,以下设置处于活动状态:
我会假设,正如我在设置中配置的那样,刷新令牌至少应该处于活动状态 14 天。如果没有,甚至长达 90 天?我可以使用这些设置,但它总会给我一个持续 1 天的 refresh_token。有没有人有这方面的经验或有可能的解决方案?谢谢!