在我的自定义ApplicationOAuthProvider类中,我在GrantResourceOwnerCredentials方法中具有此功能:
ApplicationUser user = await userManager.FindAsync(context.UserName, context.Password);
if (user == null)
{
context.SetError("invalid_grant", "El nombre de usuario o la contraseña no son correctos.");
context.Response.Headers.Add(ServerGlobalVariables.OwinChallengeFlag,
new[] { ((int)HttpStatusCode.Unauthorized).ToString() });
return;
}
if (user.Locked)
{
context.SetError("invalid_grant", "El usuario está bloqueado. Contáctese con el administrador.");
context.Response.Headers.Add(ServerGlobalVariables.OwinChallengeFlag,
new[] { ((int)HttpStatusCode.Unauthorized).ToString() });
return;
}
然后,在我的自定义OwinMiddleware中,我拥有:
public override async Task Invoke(IOwinContext context)
{
await Next.Invoke(context);
if (context.Response.StatusCode == 400
&& context.Response.Headers.ContainsKey(
ServerGlobalVariables.OwinChallengeFlag))
{
var headerValues = context.Response.Headers.GetValues
(ServerGlobalVariables.OwinChallengeFlag);
context.Response.StatusCode =
Convert.ToInt16(headerValues.FirstOrDefault());
context.Response.Headers.Remove(
ServerGlobalVariables.OwinChallengeFlag);
}
}
这样,我将响应代码从400(错误请求)更改为401(未授权)。到目前为止,一切都很好,但是现在,在JavaScript中,如何检索错误消息集?
要发布登录表单,我需要输入以下代码:
$.ajax({
type: 'POST',
url: '/Token',
data: loginData
}).done(function (data) {
self.user(data.userName);
// Cache the access token in session storage.
sessionStorage.setItem(tokenKey, data.access_token);
location.reload();
}).fail(function (jqXHR) {
hideWaitMe('#loginform');
if (jqXHR.status == 400) // Bad Request
{
swal({
type: 'error',
title: 'Ups...',
text: 'El nombre de usuario o la contraseña no son correctos.'
});
}
else
showError(jqXHR);
最后,showError方法是:
function showError(jqXHR) {
self.result(jqXHR.status + ': ' + jqXHR.statusText);
if (response) {
if (response.message) self.errors.push(response.message);
if (response.ModelState) {
var modelState = response.ModelState;
for (var prop in modelState) {
if (modelState.hasOwnProperty(prop)) {
var msgArr = modelState[prop]; // expect array here
if (msgArr.length) {
for (var i = 0; i < msgArr.length; ++i) self.errors.push(msgArr[i]);
}
}
}
}
if (response.error) self.errors.push(response.error);
if (response.error_description) self.errors.push(response.error_description);
var mensaje = response.error_description;
if (response.message && response.message != '')
mensaje = response.message;
swal({
type: 'error',
title: 'Ups...',
text: mensaje
});
}
}
XHR对象的statusText属性仅为“未经授权”。responseJSON属性为null。
我该怎么办?谢谢
Jaime