OWIN究竟使用什么函数来生成令牌?它能被杠杆化吗?

本文关键字:令牌 究竟 什么 函数 OWIN | 更新日期: 2023-09-27 18:07:13

我可以看到使用以下代码生成令牌的方法如

所示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);
        }

    }
}

作为消费者,我用我的凭据对http://localhost:9000/token进行REST调用,magically获得访问令牌

我希望能够利用令牌生成功能在其他场景中使用,手动创建对**this particular** OWIN服务器有效的令牌。

其次,是否可能有多个授权提供程序,这些授权提供程序可以有条件地由该服务器使用。如果是这样,如何在不从头实现令牌生成器的情况下做到这一点(比如外部登录的东西)?

OWIN究竟使用什么函数来生成令牌?它能被杠杆化吗?

无论如何,我们是这样做的:

        var options = new OAuthAuthorizationServerOptions();
        var ticket = new AuthenticationTicket(...);
        var tokenContext = new AuthenticationTokenCreateContext(null, options.AccessTokenFormat, ticket);
        await context.options.AccessTokenProvider.CreateAsync(tokenContext);
        var token = tokenContext.Token;
        if (string.IsNullOrEmpty(token)) token = tokenContext.SerializeTicket();
        return token;

options必须是你的OAuthAuthorizationServerOptions,从你的应用调用useoauthauthorizationserver (options)。

这主要复制OAuthAuthorizationServerHandler生成承载令牌的方式。AspNetKatana/OAuthAuthorizationServerHandler.cs

您可以在这里看到代码。这很难理解。为了使其符合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这样的东西。

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);
     }
 }

这是一种方式,但我仍然不知道这是否是微软实现它的官方方式。如果有一个内置函数可以做到这一点,那就太好了。