У меня есть ASP. NET Веб-приложение (. NET Framework) на основе шаблона Visual Studio 2019 с настраиваемой аутентификацией для отдельных учетных записей пользователей.
public void ConfigureAuth(IAppBuilder app)
{
// Configure the db context and user manager to use a single instance per request
app.CreatePerOwinContext(ApplicationDbContext.Create);
app.CreatePerOwinContext<ApplicationUserManager>(ApplicationUserManager.Create);
// Enable the application to use a cookie to store information for the signed in user
// and to use a cookie to temporarily store information about a user logging in with a third party login provider
app.UseCookieAuthentication(new CookieAuthenticationOptions());
app.UseExternalSignInCookie(DefaultAuthenticationTypes.ExternalCookie);
// Configure the application for OAuth based flow
PublicClientId = "self";
OAuthOptions = new OAuthAuthorizationServerOptions
{
TokenEndpointPath = new PathString("/Token"),
Provider = new ApplicationOAuthProvider(PublicClientId),
AuthorizeEndpointPath = new PathString("/api/Account/ExternalLogin"),
AccessTokenExpireTimeSpan = TimeSpan.FromDays(10),
// In production mode set AllowInsecureHttp = false
AllowInsecureHttp = false
};
// Enable the application to use bearer tokens to authenticate users
app.UseOAuthBearerTokens(OAuthOptions);
}
Работает с почтальоном. Я могу получить токен и контроллер доступа, помеченный как [Authorize]
. Я борюсь с аутентификацией MobileServiceClient, который я использую для автономной синхронизации c. Клиент инициализируется следующим образом:
client = new MobileServiceClient(App.BackendUrl, new NativeMessageHandler());
public async Task LoginAsync(string username, string password)
{
try
{
var token = await GetAuthenticationToken(username, password);
MobileServiceUser user = new MobileServiceUser(token.userName);
user.MobileServiceAuthenticationToken = token.Access_Token;
client.CurrentUser = user;
}
catch (InvalidGrantException)
{
throw;
}
catch (MobileServiceInvalidOperationException ex)
{
throw;
}
catch (Exception ex)
{
Crashes.TrackError(ex);
Debug.WriteLine(ex);
throw;
}
}
private async Task<AuthenticationToken> GetAuthenticationToken(string username, string password)
{
var keyValues = new List<KeyValuePair<string, string>>
{
new KeyValuePair<string, string>("username", username),
new KeyValuePair<string, string>("password", password),
new KeyValuePair<string, string>("grant_type", "password")
};
HttpContent httpContent = new FormUrlEncodedContent(keyValues);
httpContent.Headers.ContentType = new MediaTypeHeaderValue("application/x-www-form-urlencoded");
try
{
var response = await client.InvokeApiAsync("/token",
httpContent,
HttpMethod.Post,
null,
null);
return JsonConvert.DeserializeObject<AuthenticationToken>(await response.Content.ReadAsStringAsync());
}
catch (MobileServiceInvalidOperationException exception)
{
if (string.Equals(exception.Message, "invalid_grant"))
throw new InvalidGrantException("invalid credentials", exception);
else
throw;
}
}
Вот некоторый код для тестирования:
public async Task InitializeAsync()
{
if (client?.SyncContext?.IsInitialized ?? false)
return;
// Create a reference to the local sqlite store
const string path = "syncstore.db";
var store = new MobileServiceSQLiteStore(path);
// Define the database schema
store.DefineTable<Brand>(); brandTable = new AzureCloudTable<Brand>(client, null);
// Actually create the store and update the schema
try
{
await client.SyncContext.InitializeAsync(store);
}
catch (Exception ex)
{
Crashes.TrackError(ex);
Debug.WriteLine(ex);
}
}
async Task Test(string username, string password)
{
await LoginAsync("Simulator8", " ");
await InitializeAsync();
//Test pull
try
{
await brandTable.PullAsync();
}
catch (Exception ex)
{
}
}
Исключение тестовых бросков:
+ ex { Microsoft. WindowsAzure .MobileServices.MobileServiceInvalidOperationException: запрос не может быть выполнен. (Несанкционировано) в Microsoft. WindowsAzure .MobileServices.MobileServiceHttpClient.ThrowInvalidResponse (Запрос System. Net .Http.HttpRequestMessage, System. Net .Http.HttpResponseMessage response) [0x0012. WindowsAzure .MobileServices.MobileServiceHttpClient.SendRequestAsyn c (System. Net .Http.HttpClient client, System. Net .Http.HttpRequestMessage запрос, System.Boolean Обеспечение возврата ответа. Подтверждение возврата. [0x00121] в: 0 в Microsoft. WindowsAzure .MobileServices.MobileServiceHttpClient.RequestAsyn c (System.Boolean UseHandlers, System. Net .Http.HttpMethod, System.String uriPathAndQuery, Microsoft. *Azure .MobileServices.MobileServiceUser user, System.String content, System.Boolean sureResponseContent, System.Collections.Generi c .IDictionary 2[TKey,TValue] requestHeaders, System.Threading.CancellationToken cancellationToken) [0x000f0] in <d385e67aff524dc7bd2d27425b9e81ae>:0
at Microsoft.WindowsAzure.MobileServices.MobileServiceTable.ReadAsync (System.String uriString, Microsoft.WindowsAzure.MobileServices.MobileServiceFeatures features) [0x0009c] in <d385e67aff524dc7bd2d27425b9e81ae>:0
at Microsoft.WindowsAzure.MobileServices.MobileServiceTable.ReadAsync (System.String query, System.Collections.Generic.IDictionary
2 [TKey, TValue] параметры, Microsoft. WindowsAzure. MobileServices.MobileServiceFeatures функции) [0x00136] в: 0 в Microsoft. WindowsAzure .MobileService s.Syn c .PullAction.ProcessTableAsyn c () [0x00134] в: 0 в Microsoft. WindowsAzure .MobileServices.Syn c .TableAction.ExecuteAsyn c () [0x00251] в : 0 в Microsoft. WindowsAzure .MobileServices.Syn c .MobileServiceSyncContext.ExecuteSyncAction (Microsoft. WindowsAzure .MobileServices.Syn c .SyncAction action) [0x00090] in: 0 в Microsoft . WindowsAzure .MobileServices.Syn c .MobileServiceSyncContext.PullAsyn c (System.String tableName, Microsoft. WindowsAzure .MobileServices.Syn c .MobileServiceTableKind tableKind, System.String queryId , Запрос System.String, Microsoft. WindowsAzure .MobileServices.MobileServiceRemoteTableOptions options, System.Collections.Generi c .IDictionary 2[TKey,TValue] parameters, System.Collections.Generic.IEnumerable
1 [T] relatedTables, Microsoft. WindowsAzure .MobileServices. Читатель MobileServiceObjectReader, System.Threading.CancellationToken CancellationToken, Microsoft. WindowsAzure .MobileServices.Syn c .PullOptions pullOptions) [0x00361] в: 0
- Если я попытаюсь t Я получаю в token.Access_Token в Почтальон, он работает
- Если я пытаюсь синхронизировать c с контроллером без [Авторизовать], он работает.
- Это сообщение от Azure Поток журнала:
* 2020-04-15 18:20:10 xxxBACKENDxxx POST / токен X-ARR-LOG-ID = c0abefa4-8754-47e2-966d-add7716e6a95 443 - 000.000.000 ZUMO /4.1+(lang=Managed;+os=iOS;+os_version=13.3;+arch=MacOSX;+version=4.1.2.0) - - xxxBACKENDxxx.azurewebsites. net 200 0 0 1825 1377 6312
2020-04-15 18:20:10 xxxBACKENDxxx GET / таблицы / Бренд $ filter = (updatedAt% 20ge% 20datetimeoffset'2020-04-06T21% 3A05% 3A17.7200000% 2B00% 3A00 ') & $ orderby = updatedAt & $ skip = 0 & $ top = 50 & __ includeDeleted = true & X-ARR-LOG-ID = 287a5464-caad-43be-a3c5-25245e0f9f49 443 Simulator8 000.000.000 ZUMO / 4.1 + (lang = управляемый; + os = iOS; + os_version = 13,3; + arch = MacOSX; + версия = 4.1.2.0) ARRAffinity = 62f587f816224cc3b867889be38db42f5322e4bdb4b71703dac6a261166d1545; +. As pNet. Печенье = rpLpkcIS9jfvK1FyWL6q-2_5ImjYFR9yB1ZiIPd4iiTxHAGL5A0CFu4qihtFZmu-GKKQzVQ5hoxReQGQVpS7w2a0jnjvvFL4dpe_wS9_7nfTxMTBuDXiKDHGZBakbd28UR1CWvyq7iFDUI8AkKj1zrM2uYz93kpg1WMQCSx-Z3tREike74S3LqUOCnRuPjil-wMqOzDDDTJKL9JLQZ750MbQbT_-DLmj31qMa55emfGgUcSEM7I5ksMD2IIMvEeAEqwsp-XKyhp17utOTy5OepSqO8lxrGLng96GY-shVFBP4gDt7YP2bNS3RCtXkCWSOve4g7ckWDud8SAOk1KRpkj4k-B9ZogpAqc9Zuz0idTBruY3HZ3sTHCw__atnd8DQVwNQtEu8kX1Cz2WFbkO35GHOULA7TvKyGiJu-LOpf2-SZPoNl12lqH0jdvT1kI32WF2RDKbQ2W9eyWzURHOsUvekcg5EJOZUDEehXYfbo0 -. XxxBACKENDxxx.azurewebsites net 401 0 0 543 2837 46 ** +1033 *
Имя пользователя правильно , Но если я не вызову GetAuthenticationToken из LoginAsyn c и передам токен пользователю вручную. MobileServiceAuthenticationToken, то результат будет:
//var token = await GetAuthenticationToken(username, password);
MobileServiceUser user = new MobileServiceUser(username);
user.MobileServiceAuthenticationToken = "bearer _F-Bd8_74ZGV2gmKN4dkjPIRgZh7keYa-nIKpbjvSlfBV9wP2Reu9Z9Spy1eqK47LRdnXxKlMsZ5...
client.CurrentUser = user;
2020-04-15 18:15 : 34 xxxBACKENDxxx GET / таблицы / Бренд $ filter = (updatedAt% 20ge% 20datetimeoffset'2020-04-06T21% 3A05% 3A17.7200000% 2B00% 3A00 ') & $ orderby = updatedAt & $ skip = 0 & $ top = 50 & __ includeDeleted = true & X -ARR-LOG-ID = c3bcf13e-b270-4d58-897f-58cfb9727e56 443 - 000 000 000. ZUMO / 4.1 + (lang = управляемый; + os = iOS; + os_version = 13.3; + arch = MacOSX; + версия = 4.1.2.0) - - xxxBACKENDxxx.azurewebsites. net 401 0 0 543 2249 4625
Похоже, что настройка пользователя не имеет никакого эффекта.
Есть идеи, почему я не могу аутентифицировать мой MobileServiceClient?