Blazor dotnet 8 getaccesstoken указывает имя схемы аутентификации, но говорит, что это не такC#

Место общения программистов C#
Ответить
Anonymous
 Blazor dotnet 8 getaccesstoken указывает имя схемы аутентификации, но говорит, что это не так

Сообщение Anonymous »

В компоненте Blazor я хотел бы вызвать свой API, который сейчас размещен в том же приложении. Раньше это работало, пока я не добавил аутентификацию и авторизацию. Вызов API из моего браузера работает нормально. когда я пытаюсь вызвать тот же API, возвращаемое содержимое ответа представляет собой HTML для входа в систему Microsoft OIDC.
Когда я пытаюсь передать токен доступа пользователя в качестве токена на предъявителя, я получаю сообщение ошибка, в которой говорится

Код: Выделить всё

System.InvalidOperationException: IDW10503: Cannot determine the cloud Instance. The provided authentication scheme was 'MicrosoftOidc'. Microsoft.Identity.Web inferred 'MicrosoftOidc' as the authentication scheme. Available authentication schemes are 'MicrosoftOidc,Bearer,Cookies,OpenIdConnect'. See https://aka.ms/id-web/authSchemes. 
Таким образом, в нем говорится, что предоставленная схема аутентификации была MicrosoftOidc, была выведена как MicrosoftOidc, и что доступные схемы включают Microsoft Oidc. Мой пользователь входит в систему и получает назначенные роли. Я получаю эту ошибку в этой строке var token = await tokenAcquisition.GetAccessTokenForUserAsync(new[] { "Spec.Read" }, аутентификацияScheme: "MicrosoftOidc");
вот как я настраиваю аутентификацию в своей программе.cs

Код: Выделить всё

builder.Services.AddAuthentication("MicrosoftOidc")
.AddOpenIdConnect("MicrosoftOidc", oidcOptions =>
{
oidcOptions.Scope.Add(OpenIdConnectScope.OfflineAccess);
oidcOptions.SignInScheme = CookieAuthenticationDefaults.AuthenticationScheme;
oidcOptions.SaveTokens = true;
oidcOptions.Authority = builder.Configuration["AzureAd:Instance"];
oidcOptions.ClientId = builder.Configuration["AzureAd:ClientId"];
oidcOptions.ClientSecret = builder.Configuration["AzureAd:ClientSecret"];
oidcOptions.ResponseType = OpenIdConnectResponseType.Code;
oidcOptions.MapInboundClaims = false;
oidcOptions.TokenValidationParameters.NameClaimType = JwtRegisteredClaimNames.Name;
oidcOptions.TokenValidationParameters.RoleClaimType = "roles";
oidcOptions.TokenValidationParameters.IssuerValidator = AadIssuerValidator.GetAadIssuerValidator(
oidcOptions.Authority,
oidcOptions.Backchannel).Validate;
}).AddJwtBearer()
.AddMicrosoftIdentityWebApp(builder.Configuration)
.EnableTokenAcquisitionToCallDownstreamApi(builder.Configuration.GetValue("DownstreamApi:Scopes"))
.AddInMemoryTokenCaches();

var map = JsonWebTokenHandler.DefaultInboundClaimTypeMap;

builder.Services.AddAuthorization();

builder.Services.AddCascadingAuthenticationState();

builder.Services.AddRazorPages().AddMvcOptions(options=>
{
var policy = new AuthorizationPolicyBuilder()
.RequireAuthenticatedUser()
.Build();
options.Filters.Add(new AuthorizeFilter(policy));
}).AddMicrosoftIdentityUI();

builder.Services.Configure(options =>
{
options.ForwardedHeaders = ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto | ForwardedHeaders.XForwardedHost;

options.KnownNetworks.Clear();
options.KnownProxies.Clear();

options.AllowedHosts = builder.Configuration.GetSection("AllowedHosts").Get();
});

builder.Services.AddServerSideBlazor();
builder.Services.AddControllers();

...
var app = builder.Build();

app.UseRewriter(
new RewriteOptions().Add(context =>
{
if (context.HttpContext.Request.Path == "/signout-oidc")
context.HttpContext.Response.Redirect("https://Corrugated.io");
}));

app.UseForwardedHeaders();
app.UseHttpsRedirection();
app.UseDefaultFiles();
app.UseStaticFiles();

app.UseRouting();
app.MapControllers();

app.UseAuthentication();
app.UseAuthorization();

app.MapBlazorHub();
app.MapFallbackToPage("/_Host");

app.Run();
вот соответствующие настройки приложения

Код: Выделить всё

{
"AzureAd": {
"Instance": "https://login.microsoftonline.com/common/",
"TenantId": "be664a41-9b40-4c81-b11e-e52879b29fe9",
"ClientId": "f75fae40-5787-48f4-8834-7354c224e530",
"CallbackPath": "/signin-oidc",
"ClientSecret": "super secret"
},

"DownstreamApi": {
"BaseUrl": "https://graph.microsoft.com/v1.0",
"RelativePath": "me",
"Scopes": [
"user.read"
]
}
}
Что я здесь делаю не так? переход на связанный сайт aka мне на самом деле не помогает, поскольку он настраивает аутентификацию немного по-другому, но не сильно, в основном просто передавая значения по умолчанию.
Также я могу быть попытка вызвать API неправильным способом. Один из других моих внутренних компонентов выполняет вызов js-взаимодействия с другим моим контроллером API и правильно аутентифицируется. Должен ли я просто сделать это? Я думаю, что передача токена на предъявителя будет более правильной. особенно, если позже я попытаюсь внедрить API.

Подробнее здесь: https://stackoverflow.com/questions/781 ... ys-it-isnt
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»