Где в архитектуре Web Api/Owin обрабатываются запросы к «/токену»?

Я пытаюсь понять аутентификацию и авторизацию отдельных учетных записей Asp.net Web Api. Я видел несколько руководств в Интернете, включая этот. Короче говоря, когда пользовательский агент предоставляет имя пользователя и пароль, API выдает токен, который клиент будет использовать в последующих вызовах API для идентификации себя. Пользовательский агент получает токен, отправляя запрос, как правило, по адресу: http://example.com/Token. Путь, по-видимому, установлен в классе Startup следующим образом:

TokenEndpointPath = new PathString("/Token")

Моя проблема в том, что я не могу найти методы контроллера, соответствующие этому пути. Как это работает?


person Joe    schedule 22.04.2014    source источник


Ответы (1)


Когда вы создаете новый проект с индивидуальной проверкой подлинности в ASP.NET, решение создается с помощью поставщика OAuth для обработки запроса проверки подлинности.

Если вы посмотрите на свое решение, вы должны увидеть папку Providers с классом ApplicationOAuthProvider.

Этот класс реализует всю логику для аутентификации ваших участников на вашем веб-сайте. Конфигурация задается при запуске, чтобы вы могли настроить конечную точку URL-адреса с помощью OAuthOption.

OAuthOptions = new OAuthAuthorizationServerOptions
{
    TokenEndpointPath = new PathString("/Token"),
    Provider = new ApplicationOAuthProvider(PublicClientId),
    AuthorizeEndpointPath = new PathString("/api/Account/ExternalLogin"),
    AccessTokenExpireTimeSpan = TimeSpan.FromDays(14),
    AllowInsecureHttp = true
};

Свойства пути TokenEndPoint определяют URL-адрес, который запускает метод GrantResourceOwnerCredentials класса GrandResourceOwnerCredentials.

Если вы используете fiddler для аутентификации и использования такого тела

 grant_type=password&username=testUserName&password=TestPassword

вы должны пройти в следующем методе:

public override async Task GrantResourceOwnerCredentials(OAuthGrantResourceOwnerCredentialsContext context)
    {
        var userManager = context.OwinContext.GetUserManager<ApplicationUserManager>();

        ApplicationUser user = await userManager.FindAsync(context.UserName, context.Password);

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

        ClaimsIdentity oAuthIdentity = await user.GenerateUserIdentityAsync(userManager,
           OAuthDefaults.AuthenticationType);
        ClaimsIdentity cookiesIdentity = await user.GenerateUserIdentityAsync(userManager,
            CookieAuthenticationDefaults.AuthenticationType);

        AuthenticationProperties properties = CreateProperties(user.UserName);
        AuthenticationTicket ticket = new AuthenticationTicket(oAuthIdentity, properties);
        context.Validated(ticket);
        context.Request.Context.Authentication.SignIn(cookiesIdentity);
    }

где context.UserName и context.Password устанавливаются с данными, используемыми в запросе. После подтверждения личности (здесь с использованием Entity Framework и пары userName, Password в базе данных) вызывающей стороне отправляется токен Bearer. Затем этот токен носителя можно использовать для аутентификации для других вызовов.

С уважением.

person Jeremie Devillard    schedule 22.04.2014
comment
@ Джереми, спасибо, что прояснил это. Действительно отличное объяснение, и это была моя точная проблема. Может ли кто-нибудь сказать мне, является ли использование этого токена носителя oauth по умолчанию лучшим и наиболее безопасным способом обеспечения безопасности в вашем API? Я занят разработкой API, который будет доступен в Интернете и будет использоваться мобильным приложением angularjs, над которым я также сейчас работаю. Любые другие альтернативы? Очень признателен. - person fransHbrink; 08.01.2015
comment
@Jeremie, возможно ли иметь несколько URL-адресов конечных точек, которые указывают на одно и то же приложение IAppBuilder. Если нет, то как мы можем иметь несколько конечных точек токенов в одном приложении веб-API? - person Jami; 22.01.2016