Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/32.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net 如何使用OWIN在承载/访问令牌中定义clientID(或其他数据)_Asp.net_Oauth_Owin_Katana - Fatal编程技术网

Asp.net 如何使用OWIN在承载/访问令牌中定义clientID(或其他数据)

Asp.net 如何使用OWIN在承载/访问令牌中定义clientID(或其他数据),asp.net,oauth,owin,katana,Asp.net,Oauth,Owin,Katana,我试图弄清楚如何将clientID(或我可能需要的任何其他数据)放入承载/访问令牌中 我正在使用OWIN OAuth创建令牌。我可以将声明添加到身份票证中,然后将其加密/序列化到令牌中并传递回客户端 然后,客户端调用受保护的API,API反序列化令牌并为用户设置IPrinciple。此标识对象包含用户名和ClaimSideEntity中的作用域 我希望获得其他信息,例如首先请求获取令牌的clientID 我可以将这些数据放入索赔中;这显然是可行的,但它是一个黑客 我已经做了相当多的搜索,如果可能

我试图弄清楚如何将clientID(或我可能需要的任何其他数据)放入承载/访问令牌中

我正在使用OWIN OAuth创建令牌。我可以将声明添加到身份票证中,然后将其加密/序列化到令牌中并传递回客户端

然后,客户端调用受保护的API,API反序列化令牌并为用户设置IPrinciple。此标识对象包含用户名和ClaimSideEntity中的作用域

我希望获得其他信息,例如首先请求获取令牌的clientID

我可以将这些数据放入索赔中;这显然是可行的,但它是一个黑客

我已经做了相当多的搜索,如果可能的话,我不确定如何在承载/访问令牌中存储额外的数据


提前谢谢

您可以将其存储在
AuthenticationProperties
对象中,代码如下:

            var props = new AuthenticationProperties(new Dictionary<string, string>
            {
                { 
                    "as:client_id", (context.ClientId == null) ? string.Empty : context.ClientId
                },
                { 
                    "userName", context.UserName
                }
            });

        var ticket = new AuthenticationTicket(identity, props);

如果要使用AuthenticationProperties,必须重写TokenEndpoint,否则将不会返回属性

public override Task TokenEndpoint(OAuthTokenEndpointContext context)
    {
      foreach (KeyValuePair<string, string> property in context.Properties.Dictionary)
      {
        context.AdditionalResponseParameters.Add(property.Key, property.Value);
      }

      return Task.FromResult<object>(null);
    }
public覆盖任务令牌端点(OAuthTokenEndpointContext)
{
foreach(context.Properties.Dictionary中的KeyValuePair属性)
{
AdditionalResponseParameters.Add(property.Key,property.Value);
}
返回Task.FromResult(空);
}

这在身份验证服务器上非常有效。但是受保护的资源呢?例如,接受这些令牌的Web API。使用以下选项:app.useAuthBeareAuthentication(新的Microsoft.Owin.Security.OAuth.OAuthBeareAuthenticationOptions());它也会工作,我已经在资源服务器上做了,而不是在授权服务器上,请检查它,在这个上下文中,令牌值来自哪里?@TaiseerJoudeh感谢您的回答和很棒的博客。我在这里很困惑,什么应该放在AuthenticationProperties中,什么应该放在claim identity中?@Chengwhyn在claims identity中,你没有把你想要它编码的信息放在它自己的令牌中,在AuthenticationProperties中,您也可以执行此操作,但如果覆盖方法TokenEndpoint,则所有属性都将返回响应。您应该始终以更标准的方式将索赔存储在索赔标识中。
public override Task TokenEndpoint(OAuthTokenEndpointContext context)
    {
      foreach (KeyValuePair<string, string> property in context.Properties.Dictionary)
      {
        context.AdditionalResponseParameters.Add(property.Key, property.Value);
      }

      return Task.FromResult<object>(null);
    }