PostAsync to / Token返回内部服务器错误

时间:2015-06-03 20:20:56

标签: c# asp.net asp.net-web-api2

我有一个网络Api,其路径指向Startup.Auth中的登录令牌设置,如下所示:

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

那应该将我的api登录请求路由到这里:

    [OverrideAuthentication]
    [HostAuthentication(DefaultAuthenticationTypes.ExternalCookie)]
    [AllowAnonymous]
    [Route("ExternalLogin", Name = "ExternalLogin")]
    public async Task<IHttpActionResult> GetExternalLogin(string provider, string error = null)
    {
     Authorize stuff...
    }

从我的客户端我正在尝试登录并获取访问令牌:

        var loginResponse = await client.PostAsync("/Token", loginContent);

使用登录内容:

        var values = new Dictionary<string, string>();
        values.Add("grant_type", "password");
        values.Add("username", "usernamehere");
        values.Add("password", "passwordhere");
        var loginContent = new FormUrlEncodedContent(values); 

当我尝试进入/ Token的PostAsync以获取access_token时,我总是遇到内部服务器错误。我甚至无法进入api看看发生了什么。

如果我从api方法中删除[Authorize]装饰,我可以恢复我的数据......我无法登录。

如果我转到浏览器并将以下内容放入网址进行测试...

 https://localhost:44305/Token

我收到了(400)错误的请求。不知道下一步该尝试什么。

我必须让Token Auth工作......没有安全性就无法发布。 ;)

更新:

我应该补充说我正在使用自定义UserStore来识别身份。

更新2:客户端

    public static HttpClient GetClient()
    {

        HttpClient Client = new HttpClient();

        Client.BaseAddress = new Uri(Ics2Constants.ICS2APIBaseAddress);
        Client.DefaultRequestHeaders.Accept.Clear();
        Client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

        return Client;
    }

然后使用:

using (var client = ICS2HttpClient.GetClient())
        {
            //TESTING:
            await ICS2HttpClient.Authenticate(client);

            //... more stuff after authentication 
        }   

身份验证包含PostAsync ...

2 个答案:

答案 0 :(得分:0)

授权属性不应放在任何获取令牌的匿名方法之上

答案 1 :(得分:0)

以防其他人犯同样的愚蠢错误:

GrantResourceOwnerCredentials是/ Token在验证用户/密码并丢弃访问令牌时路由到的位置。

在我的情况下,下面的代码位于ApplicationOAuthProvider.cs的Providers目录中

public class ApplicationOAuthProvider : OAuthAuthorizationServerProvider
{
    private readonly string _publicClientId;

    public ApplicationOAuthProvider(string publicClientId)
    {
        if (publicClientId == null)
        {
            throw new ArgumentNullException("publicClientId");
        }

        _publicClientId = publicClientId;
    }

    public override async Task GrantResourceOwnerCredentials(OAuthGrantResourceOwnerCredentialsContext context)
    {
       // use the userManager to find the user, check credentials, grab roles, etc.  
    }

如果有人需要更多帮助,我可以发布更多细节。我知道弄清楚所有细节对我来说很痛苦。

还有一点需要注意。我根据mySQL标识内容here

编写了自定义标识内容