2016-09-15 5 views
2

я могу видеть, как генерировать маркеры, используя следующий код , как описано вкакая функция делает owin именно для генерации токена; Могут ли быть использованы?

http://bitoftech.net/2014/06/01/token-based-authentication-asp-net-web-api-2-owin-asp-net-identity/

OAuthAuthorizationServerOptions OAuthServerOptions = new OAuthAuthorizationServerOptions() 
{ 
    AllowInsecureHttp = true, 
    TokenEndpointPath = new PathString("/token"), 
    AccessTokenExpireTimeSpan = TimeSpan.FromDays(1), 
    Provider = new SimpleAuthorizationServerProvider() 
}; 

// Token Generation 
app.UseOAuthAuthorizationServer(OAuthServerOptions); 

var bearerAuth = new OAuthBearerAuthenticationOptions() 
{ 
    Provider = new OAuthBearerAuthenticationProvider() 
}; 

app.UseOAuthBearerAuthentication(bearerAuth); 


public class SimpleAuthorizationServerProvider : OAuthAuthorizationServerProvider 
{ 


    public override async Task ValidateClientAuthentication(OAuthValidateClientAuthenticationContext context) 
    { 
     context.Validated(); 
    } 

    public override async Task GrantResourceOwnerCredentials(OAuthGrantResourceOwnerCredentialsContext context) 
    { 

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

     var manager = new UserManager<User, long>(new UserStore(new UserRepository())); 
     var user = await manager.FindAsync(context.UserName, context.Password); 

     if (user == null) 
     { 
      context.SetError("invalid_grant", "The user name or password is incorrect."); 
     } 
     else 
     { 
      var identity = new ClaimsIdentity(context.Options.AuthenticationType); 
      identity.AddClaim(new Claim("name",user.Email)); 
      context.Validated(identity); 
     } 


    } 
} 

Как потребитель я делаю REST вызов http://localhost:9000/token со своими учетными данными и magically получить маркер доступа

Я хотел бы иметь возможность использовать эту функцию генерации токена для использования в других сценариях, чтобы вручную создать токен, который был бы действителен для сервера OWIN **this particular**.

Во-вторых, возможно ли иметь несколько поставщиков авторизации, которые могут быть условно использованы этим сервером. Если да, то как это сделать, не используя генератор токенов с нуля (например, внешний материал для входа)?

ответ

0

Owin руководство http://www.asp.net/aspnet/overview/owin-and-katana/owin-oauth-20-authorization-server имеет следующий метод для создания маркеров .....

private readonly ConcurrentDictionary<string, string> _authenticationCodes = 
    new ConcurrentDictionary<string, string>(StringComparer.Ordinal); 

private void CreateAuthenticationCode(AuthenticationTokenCreateContext context) 
{ 
    context.SetToken(Guid.NewGuid().ToString("n") + Guid.NewGuid().ToString("n")); 
    _authenticationCodes[context.Token] = context.SerializeTicket(); 
} 

private void ReceiveAuthenticationCode(AuthenticationTokenReceiveContext context) 
{ 
    string value; 
    if (_authenticationCodes.TryRemove(context.Token, out value)) 
    { 
     context.DeserializeTicket(value); 
    } 
} 

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

+1

Примечание: GUID является ** НЕ ** криптографически защищенным – zerkms

+0

Благодарю вас, я не решался использовать это, даже если его в официальных руководствах MS. Знаете ли вы какие-нибудь лучшие способы? – heyNow

+0

Обратите внимание, что этот код является _not_ генерированием токена доступа в «SetToken». Он генерирует код для использования с типом предоставления кода авторизации OAuth. https://tools.ietf.org/html/rfc6749#section-4.1 – Daniel

0

see the code here. Это может быть трудно следовать. Существует много, что идет в делает его следовать OAuth спецификации и быть подключаемым (вы можете поменять лексемы формат, например), но в конечном счете, конфигурация по умолчанию делает что-то вроде этого за кулисами, чтобы генерировать маркеры:

var ticket = new AuthenticationTicket(new ClaimsIdentity(new GenericIdentity("bob")), new AuthenticationProperties()); 
    IDataProtector dataProtecter = null; 
    var format = new TicketDataFormat(dataProtecter); 
    var accessToken = format.Protect(ticket); 

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