PostAsync to /Token returns 内部服务器错误

PostAsync to /Token returns Internal server error

我有一个网络 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); 

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

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

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

 https://localhost:44305/Token

我收到一个 (400) 错误请求。不确定接下来要尝试什么。

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

更新:

我应该补充一点,我正在使用自定义 UserStore 进行标识。

更新二:客户端

    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 
        }   

Authenticate 包含 PostAsync...

Authorize 属性不应放在任何获取令牌的方法之上它应该是匿名的

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

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.  
    }

如果有人需要更多帮助,我可以post提供更多详细信息。我知道弄清楚所有细节对我来说很痛苦。

再补充一点。我根据 mySQL 身份资料 here

编写了自定义身份资料