2016-05-20 3 views
0

Ссылаясь на это decision template для выбора правильного типа гранта для моего приложения. enter image description here Я не совсем уверен, какой тип типа использовать.Какой грант OAuth2.0 я должен выбрать

Сценарий как следует:

  1. ресурсов сервера, WebAPI 2.0 (Домен)
  2. сервер авторизации (домен B)
  3. ASP.NET MVC приложений, делает на основе JQuery Ajax запросы к ресурсу Сервер

В принципе, я хочу, чтобы все пользователи loggedIn моего приложения MVC могли сразу делать запросы ajax из браузера клиента непосредственно на сервер ресурсов с помощью носителя Авт.

Владелец токена доступа будет агентом пользователя браузера, который будет хранить токен доступа в локальном хранилище, например, верно? У каждого пользователя loggedIn будет свой собственный токен аутентификации. Клиенты (браузеры) приложения MVC являются клиентами «First party», не так ли?

Какой тип гранта будет в конце -> Предоставление пароля?

ответ

1

Тип grant_type для вашего пароля будет «паролем». Например, воспользуйтесь этим примером из моей заявки:

JAVASCRIPT - Аутентификация с использованием углов с использованием OAuth2.0 и C# WebAPI 2.0 (MVC) - Используемый шаблон.

return $http({ 
       url: $rootScope.globals.apiPath + "/someController/token", 
       method: 'POST', 
       data: "userName=" + encodeURIComponent(username) + 
         "&password=" + encodeURIComponent(password) + 
         "&Scope=" + "website" + 
        "&grant_type=password" + // here I pass the type as password to the web api 
        "&client_id=clientIdExample", 
       headers: { 'Content-Type': 'application/x-www-form-urlencoded' } 
      }); 

Это затем обрабатывается на API с использованием владельца учетных предоставления ресурсов, как так:

C# - API

public override async Task GrantResourceOwnerCredentials(OAuthGrantResourceOwnerCredentialsContext context) 
     { 
      var source = LogUtility.InitializeContext(this.GetType()); 

      try 
      { 
       var allowedOrigin = context.OwinContext.Get<String>("clientAllowedOrigin") ?? "*"; 

       context.OwinContext.Response.Headers.Add("Access-Control-Allow-Origin", new[] { allowedOrigin }); 

       var signOnContext = await new AccessControlBusinessLogicLayer().LoadUserSignOnContextOrDefaultByCredentials(context.Options.AuthenticationType, context.UserName, context.Password); 

       if (signOnContext == null) 
       { 
        context.SetError("invalid_grant", "The user name or password is incorrect."); 

        return; 
       } 

       context.OwinContext.Set<String>("userSecurityStamp", signOnContext.SecurityStamp); 

       var authenticationProperties = new AuthenticationProperties(
        new Dictionary<String, String> 
        { 
         { "client_id", context.ClientId } 
        }); 
       var authenticationTicket = new AuthenticationTicket(signOnContext.Identity, authenticationProperties); 

       if (context.Scope[0].ToLower() == "website") 
       { 
        using (var userContext = new AccessControlContext()) 
        { 
         using (var userManager = new UserManager<IdentityUser>(new UserStore<IdentityUser>(
          var user = AccessBL.LoadUserOrDefaultByUserName(context.UserName); 

          var userId = user.Id; 
         } 
        } 
       } 

       context.Validated(authenticationTicket); 
      } 
      catch (Exception exception) 
      { 
       throw exception; 
      } 
     } 

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

+0

Хм, я бы скорее попросил токен подписчика на предъявителя во время процесса входа в mvc-приложение (Username + Password), а затем просто отправьте обратно токен аутентификации (Bearer) клиенту браузера. И токен-носитель затем отправляется через заголовок авторизации с использованием jQuery Ajax для защищенного WebApi-носителя для каждого запроса. Это был бы процесс, который я мог бы себе представить при использовании пароля. Правильно? Потому что я не хочу передавать учетные данные пользователя в браузер, а затем на сервер ресурсов. – Legends

+0

Пятно на это именно то, что вам нужно сделать, вы только отправляете предъявителя на безопасный веб-сайт через запрошенные заголовки, и да, вы никогда не захотите передавать учетные данные пользователя в браузере, которые подвергли бы его риску безопасности , Поэтому из того, что я вижу на диаграмме процесса, если вы используете «пароль» в качестве типа гранта, вы должны двигаться в правильном направлении. И я также много исследовал об этом, и я придумал это решение, следуя передовым методам: http://bitoftech.net/2014/06/01/token-based-authentication-asp-net-web-api -2-owin-asp-net-identity/ – ThatAwesomeCoder

+0

Но в вашем примере вы вызываете конечную точку службы токена, используя учетные данные через angular.js, который работает в браузере ...?! – Legends

Смежные вопросы