Главная » Ошибки » StackOverGo – проверка доступа к серверу на основе токенов завершилась неудачно из-за ошибки инфраструктуры

StackOverGo – проверка доступа к серверу на основе токенов завершилась неудачно из-за ошибки инфраструктуры

7 ответы

4

Благодарю за ваш ответ.

Я нашел причину проблемы. Мне просто хотелось, чтобы сообщение об ошибке MS в журналах было более четким. Удаленный пользователь с проблемами доступа к журналу также был частью группы, которой было отказано в доступе к нашей базе данных. Я полностью упустил из виду эту конфигурацию. Затем я создал другую группу и предоставил доступ пользователю. Я также предоставил доступ явно, и в обоих случаях пользователям было отказано в доступе. Как только я удалил группу, которая запретила доступ, все заработало.

п.рейносо

Создан 14 июля ’10, 15:07

Pedro Reinoso

1

Возможно, для учетной записи службы, которую вы используете для подключения к серверу SQL, может отсутствовать SPN. Если, например, вы пытаетесь подключиться к sqlsrv1 из websrv1 с использованием учетной записи svcacct1, вы можете (используя учетную запись администратора домена) добавить SPN, чтобы убедиться, что AD разрешает аутентификацию с этого компьютера с использованием этой учетной записи.

setspn -A MSSQLSvc/websrv1.domain.local:1433 svcacct1

Теперь, когда вы пытаетесь подключиться к sqlsrv1 (для аутентификации с помощью MS SQL), используя svcacct1 из websrv1, учетные данные должны пройти и разрешить аутентификацию на сервере без генерации этой ошибки.

Создан 15 фев.

Miguel G

У меня была аналогичная проблема, и мой ответ исправил ее для меня, однако я вижу, что вы уже решили свою проблему. – Мигель Дж.

0

Это похоже на проблему с аутентификацией Kerberos / Windows на вашем сервере (ах) AD. Я бы посоветовался с вашим администратором AD, чтобы узнать, могут ли они помочь вам в устранении этой проблемы.

Создан 01 июля ’10, 18:07

Anon246

0

Моя проблема была немного отличной от проблемы Педро (p.reinoso). В моей настройке была создана группа домена Windows для управления доступом администраторов баз данных к серверам SQL. Человек был членом группы MyDomain SQL_Admin, но его личный вход SQL на одном из серверов был отключен. Когда мы удалили логин SQL, человек смог подключиться на основе учетных данных группы.

Создан 26 сен.

Ray

0

У меня была эта проблема, потому что пользователь был частью родительского домена, и я дал только группу, к которой он был частью доступа (например, PARENT someGroup). Получается, что эта группа – это группа «локального домена», а не глобальная / универсальная группа. Моя БД в моем дочернем домене не могла прочитать токены для локальной группы домена в родительском домене.

ответ дан 09 мар ’16, в 21:03

Ryan Shillington

0

У меня была такая же проблема:

Ошибка входа в систему для пользователя Проверка доступа к серверу на основе токенов завершилась ошибкой инфраструктуры

Я просто забыл предоставить этому пользователю Разрешения на чтение / запись в базу данных. Мы создаем пользователя для каждого веб-сайта на нашем сервере, и этому пользователю с более низкими разрешениями требуется доступ для чтения к веб-файлам, собственный пул приложений и доступ для чтения / записи к их конкретной базе данных на сервере Sql. Я забыл об этом последнем шаге и получил это непонятное сообщение в журналах. Добавление этих разрешений решило эту проблему.

ответ дан 23 мар ’16, в 14:03

Chris Moschini

0

Эта ошибка возникает для следующих учетных записей YourDomaninName ServerName $, когда вы переименовываете НОВЫЙ построенный сервер со старым именем сервера, то есть при обновлении сервера. Чтобы решить эту проблему, вам нужно будет удалить пользователя во всех сопоставленных базах данных, отказаться от входа в систему, создать имя входа и, наконец, снова предоставить разрешение базам данных.

Шаг 1. Создайте сценарий «Создать логин» (вы должны использовать сценарий, поскольку такие пользователи недоступны для поиска)

CREATE LOGIN [YourDomaninNameServerName$] FROM WINDOWS WITH DEFAULT_DATABASE=[master], DEFAULT_LANGUAGE=[us_english];

Шаг 2. Запишите базы данных, к которым у пользователя есть доступ, и предоставленные разрешения, затем удалите пользователя из каждой базы данных.

USE MyDatabase;
IF EXISTS (SELECT * FROM sys.DATABASE_principals WHERE name = N’YourDomaninNameServerName$’)
DROP USER [YourDomaninNameServerName$];

Шаг 3. Сбросьте логин с сервера

USE [Master];
IF EXISTS (SELECT * FROM sys.server_principals WHERE name = N’YourDomaninNameServerName$’)
DROP LOGIN [YourDomaninNameServerName$]

Шаг 4. Создайте логин с помощью созданного ранее скрипта.

CREATE LOGIN [YourDomaninNameServerName$] FROM WINDOWS WITH DEFAULT_DATABASE=[master], DEFAULT_LANGUAGE=[us_english];

Шаг 5. Предоставьте разрешение каждой базе данных из примечаний, сделанных на шаге 2. Этот шаг можно выполнить вручную через SSMS.

ответ дан 18 авг.

Cozzaro Nero

Не тот ответ, который вы ищете? Просмотрите другие вопросы с метками

sql-server
sql-server-2008

or задайте свой вопрос.

ADV

Связанные вопросы

1632

Как я могу удалить с помощью INNER JOIN с SQL Server?

1

Не удается подключиться к MSSQL из-за сбоя проверки доступа к серверу на основе входа в систему из-за ошибки инфраструктуры

1378

Найти все таблицы, содержащие столбец с указанным именем – MS SQL Server

127

Невозможно войти в SQL Server + проверка подлинности SQL Server + ошибка: 18456

152

Отказано в доступе при подключении базы данных

1394

Как я могу выполнить инструкцию UPDATE с JOIN в SQL Server?

110

Ошибка входа в Windows Auth в SQL Server 2008: вход из ненадежного домена

2914

Добавить столбец со значением по умолчанию в существующую таблицу в SQL Server

1. Overview

gRPC is a platform to do inter-process Remote Procedure Calls (RPC). It’s highly performant and can run in any environment.

In this tutorial, we’ll focus on gRPC error handling using Java. gRPC has very low latency and high throughput, so it’s ideal to use in complex environments like microservice architectures. In these systems, it’s critical to have a good understanding of the state, performance, and failures of the different components of the network. Therefore, a good error handling implementation is critical to help us achieve the previous goals.

4. Errors with gRPC Streams

gRPC streams allow servers and clients to send multiple messages in a single RPC call.

In terms of error propagation, the approach that we have used so far is not valid with gRPC streams. The reason is that onError() has to be the last method invoked in the RPC because, after this call, the framework severs the communication between the client and server.

When we’re using streams, this is not the desired behavior. Instead, we want to keep the connection open to respond to other messages that might come through the RPC.

A good solution to this problem is to add the error to the message itself, as we show in commodity_price.proto:

service CommodityPriceProvider {

rpc getBestCommodityPrice(Commodity) returns (CommodityQuote) {}

rpc bidirectionalListOfPrices(stream Commodity) returns (stream StreamingCommodityQuote) {}
}

message Commodity {
string access_token = 1;
string commodity_name = 2;
}

message StreamingCommodityQuote{
oneof message{
CommodityQuote comodity_quote = 1;
google.rpc.Status status = 2;
}
}

The function bidirectionalListOfPrices returns a StreamingCommodityQuote. This message has the oneof keyword that signals that it can use either a CommodityQuote or a google.rpc.Status.

In the following example, if the client sends an invalid token, the server adds a status error to the body of the response:

public StreamObserver bidirectionalListOfPrices(StreamObserver responseObserver) {

return new StreamObserver() {
@Override
public void onNext(Commodity request) {

if (request.getAccessToken().equals(“123validToken”) == false) {

com.google.rpc.Status status = com.google.rpc.Status.newBuilder()
.setCode(Code.NOT_FOUND.getNumber())
.setMessage(“The access token not found”)
.addDetails(Any.pack(ErrorInfo.newBuilder()
.setReason(“Invalid Token”)
.setDomain(“com.baeldung.grpc.errorhandling”)
.putMetadata(“insertToken”, “123validToken”)
.build()))
.build();
StreamingCommodityQuote streamingCommodityQuote = StreamingCommodityQuote.newBuilder()
.setStatus(status)
.build();
responseObserver.onNext(streamingCommodityQuote);
}
// …
}
}
}

The code creates an instance of com.google.rpc.Status and adds it to the StreamingCommodityQuote response message. It does not invoke onError(), so the framework does not interrupt the connection with the client.

Let’s look at the client implementation:

public void onNext(StreamingCommodityQuote streamingCommodityQuote) {

switch (streamingCommodityQuote.getMessageCase()) {
case COMODITY_QUOTE:
CommodityQuote commodityQuote = streamingCommodityQuote.getComodityQuote();
logger.info(“RESPONSE producer:” + commodityQuote.getCommodityName() + ” price:” + commodityQuote.getPrice());
break;
case STATUS:
com.google.rpc.Status status = streamingCommodityQuote.getStatus();
logger.info(“Status code:” + Code.forNumber(status.getCode()));
logger.info(“Status message:” + status.getMessage());
for (Any any : status.getDetailsList()) {
if (any.is(ErrorInfo.class)) {
ErrorInfo errorInfo;
try {
errorInfo = any.unpack(ErrorInfo.class);
logger.info(“Reason:” + errorInfo.getReason());
logger.info(“Domain:” + errorInfo.getDomain());
logger.info(“Insert Token:” + errorInfo.getMetadataMap().get(“insertToken”));
} catch (InvalidProtocolBufferException e) {
logger.error(e.getMessage());
}
}
}
break;
// …
}
}

The clientgets the returned message in onNext(StreamingCommodityQuote) anduses a switch statement to distinguish between a CommodityQuote or a com.google.rpc.Status.

5. Conclusion

In this tutorial, we have shown how to implement error handling in gRPC for unary and stream-based RPC calls.

gRPC is a great framework to use for remote communications in distributed systems. In these systems, it’s important to have a very robust error handling implementation to help to monitor the system. This is even more critical in complex architectures like microservices.

The source code of the examples can be found over on GitHub.

Java bottom

Get started with Spring 5 and Spring Boot 2, through the Learn Spring course:

>> CHECK OUT THE COURSE Generic footer banner

Courses

  • All Courses
  • All Bulk Courses
  • All Bulk Team Courses
  • The Courses Platform

3. Unary RPC Calls

Let’s start considering the following service interface defined in commodity_price.proto:

service CommodityPriceProvider {
rpc getBestCommodityPrice(Commodity) returns (CommodityQuote) {}
}

message Commodity {
string access_token = 1;
string commodity_name = 2;
}

message CommodityQuote {
string commodity_name = 1;
string producer_name = 2;
double price = 3;
}

message ErrorResponse {
string commodity_name = 1;
string access_token = 2;
string expected_token = 3;
string expected_value = 4;
}

The input of the service is a Commodity message. In the request, the client has to provide an access_token and a commodity_name.

The server responds synchronously with a CommodityQuote that states the comodity_name, producer_name, and the associated price for the Commodity.

For illustration purposes, we also define a custom ErrorResponse.  This is an example of a custom error message that we’ll send to the client as metadata.

3.1. Response Using io.grpc.Status

In the server’s service call, we check the request for a valid Commodity:

public void getBestCommodityPrice(Commodity request, StreamObserver responseObserver) {

if (commodityLookupBasePrice.get(request.getCommodityName()) == null) {

Metadata.Key errorResponseKey = ProtoUtils.keyForProto(ErrorResponse.getDefaultInstance());
ErrorResponse errorResponse = ErrorResponse.newBuilder()
.setCommodityName(request.getCommodityName())
.setAccessToken(request.getAccessToken())
.setExpectedValue(“Only Commodity1, Commodity2 are supported”)
.build();
Metadata metadata = new Metadata();
metadata.put(errorResponseKey, errorResponse);
responseObserver.onError(io.grpc.Status.INVALID_ARGUMENT.withDescription(“The commodity is not supported”)
.asRuntimeException(metadata));
}
// …
}

In this simple example, we return an error if the Commodity doesn’t exist in the commodityLookupBasePriceHashTable.

First, we build a custom ErrorResponse and create a key-value pair which we add to the metadata in metadata.put(errorResponseKey, errorResponse).

We use io.grpc.Status to specify the error status. The function responseObserver::onError takes a Throwable as a parameter, so we use asRuntimeException(metadata) to convert the Status into a Throwable. asRuntimeException can optionally take a Metadata parameter (in our case, an ErrorResponse key-value pair), which adds to the trailers of the message.

If the client makes an invalid request, it will get back an exception:

@Test
public void whenUsingInvalidCommodityName_thenReturnExceptionIoRpcStatus() throws Exception {

Commodity request = Commodity.newBuilder()
.setAccessToken(“123validToken”)
.setCommodityName(“Commodity5”)
.build();

StatusRuntimeException thrown = Assertions.assertThrows(StatusRuntimeException.class, () -> blockingStub.getBestCommodityPrice(request));

assertEquals(“INVALID_ARGUMENT”, thrown.getStatus().getCode().toString());
assertEquals(“INVALID_ARGUMENT: The commodity is not supported”, thrown.getMessage());
Metadata metadata = Status.trailersFromThrowable(thrown);
ErrorResponse errorResponse = metadata.get(ProtoUtils.keyForProto(ErrorResponse.getDefaultInstance()));
assertEquals(“Commodity5”,errorResponse.getCommodityName());
assertEquals(“123validToken”, errorResponse.getAccessToken());
assertEquals(“Only Commodity1, Commodity2 are supported”, errorResponse.getExpectedValue());
}

The call to blockingStub::getBestCommodityPrice throws a StatusRuntimeExeption since the request has an invalid commodity name.

We use Status::trailerFromThrowable to access the metadata. ProtoUtils::keyForProto gives us the metadata key of ErrorResponse.

3.2. Response Using com.google.rpc.Status

Let’s consider the following server code example:

public void getBestCommodityPrice(Commodity request, StreamObserver responseObserver) {
// …
if (request.getAccessToken().equals(“123validToken”) == false) {

com.google.rpc.Status status = com.google.rpc.Status.newBuilder()
.setCode(com.google.rpc.Code.NOT_FOUND.getNumber())
.setMessage(“The access token not found”)
.addDetails(Any.pack(ErrorInfo.newBuilder()
.setReason(“Invalid Token”)
.setDomain(“com.baeldung.grpc.errorhandling”)
.putMetadata(“insertToken”, “123validToken”)
.build()))
.build();
responseObserver.onError(StatusProto.toStatusRuntimeException(status));
}
// …
}

In the implementation, getBestCommodityPrice returns an error if the request doesn’t have a valid token.

Moreover, we set the status code, message, and details to com.google.rpc.Status.

In this example, we’re using the predefined com.google.rpc.ErrorInfo instead of our custom ErrorDetails (although we could have used both if needed). We serialize ErrorInfo using Any::pack().

The class StatusProto::toStatusRuntimeException converts the com.google.rpc.Status into a Throwable.

In principle, we could also add other messages defined in error_details.proto to further customized the response.

The client implementation is straightforward:

@Test
public void whenUsingInvalidRequestToken_thenReturnExceptionGoogleRPCStatus() throws Exception {

Commodity request = Commodity.newBuilder()
.setAccessToken(“invalidToken”)
.setCommodityName(“Commodity1”)
.build();

StatusRuntimeException thrown = Assertions.assertThrows(StatusRuntimeException.class,
() -> blockingStub.getBestCommodityPrice(request));
com.google.rpc.Status status = StatusProto.fromThrowable(thrown);
assertNotNull(status);
assertEquals(“NOT_FOUND”, Code.forNumber(status.getCode()).toString());
assertEquals(“The access token not found”, status.getMessage());
for (Any any : status.getDetailsList()) {
if (any.is(ErrorInfo.class)) {
ErrorInfo errorInfo = any.unpack(ErrorInfo.class);
assertEquals(“Invalid Token”, errorInfo.getReason());
assertEquals(“com.baeldung.grpc.errorhandling”, errorInfo.getDomain());
assertEquals(“123validToken”, errorInfo.getMetadataMap().get(“insertToken”));
}
}
}

StatusProto.fromThrowable is a utility method to get the com.google.rpc.Status directly from the exception.

From status::getDetailsList we get the com.google.rpc.ErrorInfo details.

CSRF-token — что это?

CSRF-token — это самый эффективный способ защититься от CSRF-атаки. Причем он не только эффективный, но и очень простой. Суть его в том, что сервер формирует случайный набор байт и отправляет их браузеру клиента. Набор байт — это и есть токен. Потом, когда браузер отправляет запрос серверу, происходит проверка, возвращает ли обратно браузер CSRF-token. Если токен, который генерировал сервер совпадает с тем, который вернул браузер, тогда все хорошо и сессия продолжается.

CSRF-token обычно защищает только небезопасные HTTP-запросы, например:

  • POST;

  • PUT;

  • DELETE;

  • PATCH.

Безопасные методы HTTP-запросов нет смысла дополнительно защищать токеном.

К CSRF-token применяются следующие требования:

  • должен быть уникальным для каждой отдельной операции;

  • должен действовать единоразово;

  • обладает  размером, который обеспечивает ему устойчивость к подбору;

  • генерируется специальным криптографическим генератором случайных чисел;

  • имеет ограничение по времени жизни.

2. Basics of Error Handling in gRPC

Errors in gRPC are first-class entities, i.e., every call in gRPC is either a payload message or a status error message.

The errors are codified in status messages and implemented across all supported languages.

In general, we should not include errors in the response payload. To that end, always use StreamObserver::OnError, which internally adds the status error to the trailing хедерs. The only exception, as we’ll see below, is when we’re working with streams.

All client or server gRPC libraries support the official gRPC error model. Java encapsulates this error model with the class io.grpc.Status. This class requires a standard error status code and an optional string error message to provide additional information. This error model has the advantage that it is supported independently of the data encoding used (protocol buffers, REST, etc.). However, it is pretty limited since we cannot include error details with the status.

If your gRPC application implements protocol buffers for data encoding, then you can use the richer error model for Google APIs. The com.google.rpc.Statusclass encapsulates this error model. This class provides com.google.rpc.Code values, an error message, and additional error details are appended as protobuf messages. Additionally, we can utilize a predefined set of protobuf error messages, defined in error_details.proto that cover the most common cases.  In the package com.google.rpc we have the classes: RetryInfo, DebugInfo, QuotaFailure, ErrorInfo, PrecondicionFailure, BadRequest, RequestInfo, ResourceInfo, and Help that encapsulate all the error messages in error_details.proto .

In addition to the two error models, we can define custom error messages that can be added as key-value pairs to the RPC metadata.

We’re going to write a very simple application to show how to use these error models with a pricing service where the client sends commodity names, and the server provides pricing values.

Источники

  • https://stackovergo.com/ru/q/695592/token-based-server-access-validation-failed-with-an-infrastructure-error
  • https://www.baeldung.com/grpcs-error-handling
  • https://CoderNet.ru/articles/drugoe/kak_rabotaet_csrf_token_zashhita_chto_delat_esli_csrf_token_istek/
[свернуть]
Решите Вашу проблему!


×
Adblock
detector