Get IPrincipal from OAuth Bearer Token in OWIN

前端 未结 4 1509
说谎
说谎 2020-11-29 22:04

I have successfully added OAuth to my WebAPI 2 project using OWIN. I receive tokens and can use them in the HTTP Header to access resources.

Now I want to use those

4条回答
  •  暗喜
    暗喜 (楼主)
    2020-11-29 22:16

    By default, OWIN use ASP.NET machine key data protection to protect the OAuth access token when hosted on IIS. You can use MachineKey class in System.Web.dll to unprotect the tokens.

    public class MachineKeyProtector : IDataProtector
    {
        private readonly string[] _purpose =
        {
            typeof(OAuthAuthorizationServerMiddleware).Namespace,
            "Access_Token",
            "v1"
        };
    
        public byte[] Protect(byte[] userData)
        {
           throw new NotImplementedException();
        }
    
        public byte[] Unprotect(byte[] protectedData)
        {
            return System.Web.Security.MachineKey.Unprotect(protectedData, _purpose);
        }
    }
    

    Then, construct a TicketDataFormat to get the AuthenticationTicket object where you can get the ClaimsIdentity and AuthenticationProperties.

    var access_token="your token here";
    var secureDataFormat = new TicketDataFormat(new MachineKeyProtector());
    AuthenticationTicket ticket = secureDataFormat.Unprotect(access_token);
    

    To unprotect other OAuth tokens, you just need to change the _purpose content. For detailed information, see OAuthAuthorizationServerMiddleware class here: http://katanaproject.codeplex.com/SourceControl/latest#src/Microsoft.Owin.Security.OAuth/OAuthAuthorizationServerMiddleware.cs

    if (Options.AuthorizationCodeFormat == null)
    {
        IDataProtector dataProtecter = app.CreateDataProtector(
            typeof(OAuthAuthorizationServerMiddleware).FullName,
            "Authentication_Code", "v1");
    
        Options.AuthorizationCodeFormat = new TicketDataFormat(dataProtecter);
    }
    if (Options.AccessTokenFormat == null)
    {
        IDataProtector dataProtecter = app.CreateDataProtector(
            typeof(OAuthAuthorizationServerMiddleware).Namespace,
            "Access_Token", "v1");
        Options.AccessTokenFormat = new TicketDataFormat(dataProtecter);
    }
    if (Options.RefreshTokenFormat == null)
    {
        IDataProtector dataProtecter = app.CreateDataProtector(
            typeof(OAuthAuthorizationServerMiddleware).Namespace,
            "Refresh_Token", "v1");
        Options.RefreshTokenFormat = new TicketDataFormat(dataProtecter);
    }
    

提交回复
热议问题