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
编写了自定义身份资料
我有一个网络 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
编写了自定义身份资料