2017-01-01 4 views
22

Может ли кто-нибудь указать мне какую-нибудь хорошую документацию или предоставить хорошую информацию о наилучшем способе реализации проверки подлинности и авторизации для API-интерфейса ASP.NET Core REST. Мне нужно аутентифицировать и авторизировать приложение сначала, а затем аутентифицируйте и авторизуйте пользователя.Идентификация приложения и пользователя с использованием ядра ASP.NET

В идеале я хочу ограничить метод контроллера, к которому может обратиться аутентифицированное приложение и/или пользователь.

Я думаю использовать AspNet.Security.OpenIdConnect.Serverenter для аутентификации приложения, но я не уверен, как лучше всего выполнить аутентификацию пользователя. Возможно, повторите использование аутентификации OpenIdConnect на другой конечной точке для пользователей с другим заголовком, чтобы содержать токен пользователя.

После проверки подлинности я подумываю о том, чтобы просто использовать базовую безопасность ролей, чтобы ограничить доступ к методам контроллеров.

Правильно ли это решение этой проблемы?

+0

Я нашел [это] (https://samueleresca.net/2016/12/developing-token-authentication-using-asp-net-core/) очень полезно, не уверен, что это то, что вы ищете. –

+0

Я бы сказал, что «безгражданство» - это путь. В сущности, вам нужно будет иметь данные с полезной нагрузкой auth, отправленные с каждым запросом, и это позволит вам определить, к чему может обращаться запрос и не может его получить. См. Это: http://www.developerhandbook.com/c-sharp/create-restful-api-authentication-using-web-api-jwt/ – scgough

+0

@MichaelEdwards Я просто пожертвовал щедростью на том же самом, прежде чем, пожалуйста, см. это [вопрос] (http://stackoverflow.com/q/42121854/1938988) и ответ на него –

ответ

0

Я не мог найти хорошую документацию по этому вопросу, однако мне нужно было достичь того же, поэтому я закодировал остальные api самостоятельно, изменив действия в стандартном шаблоне проверки подлинности ASP.NET на эквиваленты REST API.

Например вот как я работал действие входа:

// POST: /Account/Login 
    [HttpPost("[action]")] 
    [AllowAnonymous] 
    public async Task<ReturnValue<ApplicationUser>> Login([FromBody] loginModel login) 
    { 
     if (ModelState.IsValid) 
     { 
      ApplicationUser user = await _userManager.FindByEmailAsync(login.email); 

      if (user == null) 
      { 
       return new ReturnValue<ApplicationUser>(false, "Login failed, check username and password.", null); 
      } 
      // else if (user.EmailConfirmed == false) 
      // { 
      //  return new ReturnValue<ApplicationUser>(true, "Confirm email address.", null, user); 
      // } 
      else 
      { 
       // This doesn't count login failures towards account lockout 
       // To enable password failures to trigger account lockout, set lockoutOnFailure: true 
       var result = await _signInManager.PasswordSignInAsync(user, login.password, (bool)login.rememberMe, lockoutOnFailure: false); 
       if (result.Succeeded) 
       { 
        return new ReturnValue<ApplicationUser>(true, user); 
       } 
       //if (result.RequiresTwoFactor) 
       //{ 
       // return RedirectToAction(nameof(SendCode), new { ReturnUrl = returnUrl, RememberMe = model.RememberMe }); 
       //} 
       if (result.IsLockedOut) 
       { 
        return new ReturnValue<ApplicationUser>(false, "The account is locked out.", null); 
       } 
      } 
     } 
     else 
     { 
      string message = string.Join("; ", ModelState.Values.SelectMany(x => x.Errors).Select(x => x.ErrorMessage)); 
      return new ReturnValue<ApplicationUser>(false, "Invalid login attempt: " + message, null); 
     } 

     // If we got this far, something failed in the model. 
     return new ReturnValue<ApplicationUser>(false, "Login failed.", null); 
    } 

При вызове API из JavaScript в браузере куки будут загружены, и вы должны быть в состоянии сделать дополнительно разрешенные вызовы к API, если вы звоните из другого типа клиента, вы захотите убедиться, что CookieContainer сохранен для авторизированных вызовов.

С этого момента вы можете разрешить контроллеры REST API с помощью [Авторизоваться] декоратора через стандартные библиотеки Microsoft: https://docs.microsoft.com/en-us/aspnet/core/security/authentication/identity

удачи.

3

Для аутентификации вы можете использовать ASP.NET Core Identity, который будет использовать Microsoft.AspNetCore.Identity.EntityFrameworkCore пакет, который будет сохраняться идентификационные данные и схемы для SQL Server с помощью Entity Framework Core.

Для авторизации вы можете использовать Role Based Authorization, который использует пакет Microsoft.AspNetCore.Authorization.

Вы также можете оформить this video для получения дополнительной информации по авторизации ядра ASP.NET

6

Это на самом деле сложнее вопрос, что может показаться, потому что тип клиентов (программные клиенты), которые используют API, кажется, диск какой тип auth * необходим. Например, в веб-приложении, где веб-приложение требуется auth *, тогда Asp.Net Identity будет работать либо с токеном, либо с файлом cookie. Однако, если другие клиенты будут потреблять предоставленные услуги (мобильные приложения, приложения WUP, тогда это может быть проще реализовать с использованием токен-аутентификации. Когда у меня возникла эта проблема, я столкнулся с проблемой, что у меня был пробел в знаниях, потому что я сделал «т действительно понять OAuth. Я должен был вернуться к основам.

https://alexbilbie.com/guide-to-oauth-2-grants/

https://www.pluralsight.com/courses/oauth2-json-web-tokens-openid-connect-introduction

Большинство учебников по всему Asp.Чистая идентификация «Seem» должна быть ориентирована на веб-клиентов. Хотя можно найти те, которые этого не делают. С введением ядра asp.net синтаксис изменился, и многие из старых руководств, которые показывают объединение проверки файлов cookie и токенов, больше не применимы. Кроме того, Web Api больше не отделен от других типов проектов в Visual Studio, делая изменение еще более выраженным. Вот несколько старых учебников.

http://satvasolutions.com/combine-asp-net-identity-web-api-and-mvc-best-in-a-single-web-app/

http://blog.iteedee.com/2014/03/asp-net-identity-2-0-cookie-token-authentication/

Combine the use of authentication both for MVC pages and for Web API pages?

IdentityServer является вполне правильным решением, работает как с клиентом учетных данных и учетные данные владельца ресурса предоставить (пользователь, пароль) и Брок Аллен обычно очень быстро реагировать на SO под тегом

https://stackoverflow.com/questions/tagged/identityserver4

или на сайте GitHub по вопросам помечен как вопросы

https://github.com/IdentityServer/IdentityServer4/issues

с сервером тождественности, Еще раз, мне пришлось вернуться к основам и работать через учебники, чтобы получить понимание того, как это будет работать в мой проект.

https://identityserver4.readthedocs.io/en/release/intro/big_picture.html

Как Брки быстро указали мне на другую должность, идентичность asp.net эф это магазин пользователя и хорошо использовать с рабочим процессом владельца ресурса мандатного.

+0

Я запомню это движение с использованием Identity Server 4 - мы используем его с одним провайдером проверки подлинности для нескольких доменов –

0

Пожалуйста, ознакомьтесь со следующими ссылками.

Для Asp.net Ядра https://stormpath.com/blog/token-authentication-asp-net-core

Для API https://stormpath.com/blog/rest-api-mobile-dotnet-core

+0

Ссылка на решение приветствуется, но, пожалуйста, убедитесь, что ваш ответ полезен без него: [добавить контекст вокруг ссылки] (// meta.stackexchange.com/a/8259), чтобы ваши друзья-пользователи имели представление о том, что это такое и почему оно есть , затем укажите наиболее релевантную часть страницы, на которую вы ссылаетесь, если целевая страница недоступна. [Ответы, которые немного больше, чем ссылка, могут быть удалены.] (// stackoverflow.com/help/deleted-answers) – g00glen00b