Привет, я начал с образца здесь
https://github.com/Azure-Samples/active-directory-b2c-dotnet-webapp-and-webapi
И удалось заставить TaskWebApp общаться с TaskService.
Теперь я хочу расширить решение, чтобы иметь 3-й сервис
Я не уверен, что проблема в приложении ConfidentialClientApplication, поскольку, когда ему не удается получить мои токены, я не получаю никаких исключений.
Я думаю, что проблема заключается в том, что метод COnfigureApp в моем TaskWebApp ожидает управления токенами только из одного TokenService.
Вот мой метод веб-приложения Starttup.Auth ConfigureAuth, он не изменился по сравнению с примером приложения.
public void ConfigureAuth(IAppBuilder app)
{
app.UseCookieAuthentication(new CookieAuthenticationOptions());
app.SetDefaultSignInAsAuthenticationType(CookieAuthenticationDefaults.AuthenticationType);
app.UseOpenIdConnectAuthentication(
new OpenIdConnectAuthenticationOptions
{
// Generate the metadata address using the tenant and policy information
MetadataAddress = String.Format(AadInstance, Tenant, DefaultPolicy),
// These are standard OpenID Connect parameters, with values pulled from web.config
ClientId = ClientId,
RedirectUri = RedirectUri,
PostLogoutRedirectUri = RedirectUri,
// Specify the callbacks for each type of notifications
Notifications = new OpenIdConnectAuthenticationNotifications
{
RedirectToIdentityProvider = OnRedirectToIdentityProvider,
AuthorizationCodeReceived = OnAuthorizationCodeReceived,
AuthenticationFailed = OnAuthenticationFailed,
},
// Specify the claims to validate
TokenValidationParameters = new TokenValidationParameters
{
NameClaimType = "name"
},
// Specify the scope by appending all of the scopes requested into one string (seperated by a blank space)
Scope = $"{OpenIdConnectScopes.OpenId} {ReadTasksScope} {WriteTasksScope}"
}
);
}
Вот мой метод OnAuthorizationCodeReceived, снова без изменений
private async Task OnAuthorizationCodeReceived(AuthorizationCodeReceivedNotification notification)
{
// Extract the code from the response notification
var code = notification.Code;
var userObjectId = notification.AuthenticationTicket.Identity.FindFirst(ObjectIdElement).Value;
var authority = String.Format(
AadInstance,
Tenant,
DefaultPolicy);
var httpContext = notification.OwinContext.Environment["System.Web.HttpContextBase"] as HttpContextBase;
// Exchange the code for a token. Make sure to specify the necessary scopes
ClientCredential cred = new ClientCredential(ClientSecret);
ConfidentialClientApplication app = new ConfidentialClientApplication(
authority,
Startup.ClientId,
RedirectUri,
cred,
new NaiveSessionCache(userObjectId, httpContext));
var authResult = await app.AcquireTokenByAuthorizationCodeAsync(new string[]
{
ReadTasksScope,
WriteTasksScope
},
code,
DefaultPolicy);
}
Проблема, похоже, заключается в том, что моя область чтения и записи напрямую ссылается на TaskService, и когда я пытаюсь запросить соответствующие области из других приложений, он жалуется.
в моем контроллере
private async Task<String> acquireToken(String[] scope)
{
try
{
string userObjectID = ClaimsPrincipal.Current.FindFirst(Startup.ObjectIdElement).Value;
string authority = String.Format(Startup.AadInstance, Startup.Tenant, Startup.DefaultPolicy);
ClientCredential credential = new ClientCredential(Startup.ClientSecret);
// Retrieve the token using the provided scopes
ConfidentialClientApplication app = new ConfidentialClientApplication(authority, Startup.ClientId,
Startup.RedirectUri, credential,
new NaiveSessionCache(userObjectID, this.HttpContext));
AuthenticationResult result = await app.AcquireTokenSilentAsync(scope);
return result.Token;
}
catch (Exception e)
{
Debug.WriteLine(e.Message);
throw e;
}
Этот метод используется, но My AuthorizationResult дает сбой, и сообщение не может получить токен автоматически без внутреннего исключения.
До сих пор я пытался удалить NaiveSessionCache как необязательный, и он все еще терпит неудачу.
Чтобы обойти это, я зарегистрировал 4-й сервис, а затем заставил свои веб-сайты использовать этот единственный идентификатор клиента и секрет для управления доступом к своим ресурсам, но мне кажется, что это неправильный путь вперед.
Любая помощь будет большой спасибо