2016-08-16 4 views
7

Все,ASP.NET Идентичность 2,0 Аутентифицировать против нашего однонаправленного сервера

У меня есть сервер безопасности, которая единственная цель заключается в предоставлении на предъявителя лексем из одной конечной точки: запроса http://example.com/token

Пример:

POST http://example.com/token HTTP/1.1 
User-Agent: Fiddler 
Content-Type: x-www-form-urlencoded 
Host: example.com 
Content-Length: 73 

grant_type=password&[email protected]&password=examplePassword 

Пример ответа:

HTTP/1.1 200 OK 
Cache-Control: no-cache 
Pragma: no-cache 
Content-Type: application/json;charset=UTF-8 
Expires: -1 
Server: Microsoft-IIS/10.0 
X-Powered-By: ASP.NET 
Date: Tue, 16 Aug 2016 12:04:39 GMT 
{ 
    "access_token": "xxxx", 
    "token_type": "bearer", 
    "expires_in": 17999, 
    "refresh_token": "xxxx", 
    ".issued": "Tue, 16 Aug 2016 12:04:38 GMT", 
    ".expires": "Tue, 16 Aug 2016 17:04:38 GMT" 
} 

Мы ВГА e угловое приложение, которое использует эту конечную точку для аутентификации, и делает это просто отлично.

То, что мы пытаемся достичь без особого успеха, заключается в создании приложения MVC, которое использует тот же сервер для аутентификации, мы хотели бы, чтобы код сидел поверх Identity 2.0, если это возможно.

В нашем AccountController (пример проекте) у нас есть Login(LoginModel model) метода, который обрабатывает логин и выглядит следующим образом (так же, как шаблон пример проекта):

var result = await _signInManager.PasswordSignInAsync(model.UserName, model.Password, model.RememberMe, shouldLockout: false); 

У нас есть собственная РЕАЛИЗАЦИЯ из IUserStore, UserManager, SignInManager.

Я рассмотрел наиважнейшая

public Task<SignInStatus> PasswordSignInAsync(string userName, string password, bool isPersistent, bool shouldLockout) on `SignInManager<,>` and make a web call across to the security server. 

Реализация по умолчанию PasswordSignInAsync вызовов UserManager.FindByNameAsync Однако это означало бы, что я должен выставить метод поиска на моем сервере безопасности, чтобы подтвердить имя пользователя существует, который на самом деле не звучит неплохо.

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

(Я ценю, что я могу смешивать технологии здесь, следовательно, вопрос).

Это также работает на OWIN.

+0

Вы хотите, чтобы новое приложение MVC использовало существующий сервер аутентификации для своего токена? Если да, то какое преимущество вы надеетесь получить? –

+0

В вашем приложении MVC не должно быть контроллера входа. В любом случае, никто не принимает пользователя и пароль. Ваше приложение MVC должно пройти аутентификацию и получить AccessToken с вашего SecurityServer, и вы должны расшифровать этот токен в MVC. Это будет возможно, если сервер разделяет некоторые свойства. Прочтите эту статью для получения дополнительной информации: http://bitoftech.net/2014/09/24/decouple-owin-authorization-server-resource-server-oauth-2-0-web-api/ – Xavero

+0

Не уверен, что я правильный вопрос. * Мы пытаемся добиться без особого успеха, чтобы создать приложение MVC, которое использует тот же сервер для аутентификации *. Возможно ли ударить эту конечную точку маркера сервера безопасности через HttpClient из вашего действия AccountController Login с именем пользователя и пароль, который запустил бы токен в файле cookie ответа, если запрос будет аутентифицирован? – Developer

ответ

2

В этом случае я не думаю, что вы должны использовать Identity 2.0 в своем приложении MVC. Вы должны создать AuthenticationClient для вызова сервера аутентификации, вы можете также использовать эту библиотеку, чтобы построить такой клиент https://www.nuget.org/packages/Thinktecture.IdentityModel.Client/

public class AuthenticationClient { 
    public ClaimsIdentity GetClaimsIdentity(string username, string password) { 
     //Call your authentication server to get your token and also claims associated with your identity. 
     //You can look at an example code how to do it: https://github.com/IdentityServer/IdentityServer3.Samples/blob/master/source/Clients/ConsoleResourceOwnerClient/Program.cs 
     //and create a ClaimsIdentity object out of those information 

     var identity = GetIdentity(); 

     //The key point here is to add AccessToken and RefreshToken as custom claims to your identity so you retrieve these tokens back on subsequent requests. 
     identity.AddClaim(new Claim("access_token", accessToken)); 
     identity.AddClaim(new Claim("refresh_token", refreshToken)); 
    } 
} 

Это будет выполнять ваши требования:

аутентификации Использование куки, но и поддерживать медведя токен для последующих вызовов на наш другой сервер ресурсов.

Ваш Login метод на AccountController должен быть таким:

public ActionResult Login(LoginModel model) 
{ 
    var identity = authenticationClient.GetClaimsIdentity(model.UserName, model.Password); 

    if (identity == null) { 
     return new HttpUnauthorizedResult(); 
    } 
    //Sign in the user 
    var ctx = Request.GetOwinContext(); 
    var authenticationManager = ctx.Authentication; 
    authenticationManager.SignIn(identity); 

    return new HttpStatusCodeResult(HttpStatusCode.OK); 
} 

Я предполагаю, что вы уже зарегистрировать это промежуточное программное обеспечение для использования аутентификации Cookie:

public void ConfigureAuth(IAppBuilder app) 
{ 
    app.UseCookieAuthentication(new CookieAuthenticationOptions 
    { 
     AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie, 
     LoginPath = new PathString("/Account/Login") 
    }); 
} 

Теперь для всех последующих запросов, вы может вернуть токен доступа для вызова вашего ресурсного сервера с вашего сайта ClaimsIdentity:

User.Identity.Claims.FirstOrDefault(x => x.Type == "access_token");