我有一个asp。net应用程序,带有前端和web api部分。我希望移动应用程序能够使用受保护的web apiendpoint。这意味着我需要登录并在本机移动应用程序中处理身份验证令牌。
现在,登录到asp.net应用程序的唯一方法是通过默认asp.net /Account/Login页面。当我发布到登录终结点时,返回的正文只包含我的应用程序的html。令牌然后由asp.net.存储在cookie中
由于我正在尝试从我的本地移动应用程序登录,我不需要html响应,也不希望必须通过cookies来获取我的令牌。
是否可以创建一个单独的登录endpoint,只返回令牌和/或用户详细信息,而不是我的应用程序的html内容?这是个坏主意吗?
作为参考,这是默认的asp。我指的是net登录处理程序。
public async Task<ActionResult> Login(LoginViewModel model, string returnUrl)
{
if (!ModelState.IsValid)
{
return View(model);
}
// This doesn't count login failures towards account lockout
// To enable password failures to trigger account lockout, change to shouldLockout: true
var result = await SignInManager.PasswordSignInAsync(model.Email, model.Password, model.RememberMe, shouldLockout: false);
switch (result)
{
case SignInStatus.Success:
return RedirectToLocal(returnUrl);
case SignInStatus.LockedOut:
return View("Lockout");
case SignInStatus.RequiresVerification:
return RedirectToAction("SendCode", new { ReturnUrl = returnUrl, RememberMe = model.RememberMe });
case SignInStatus.Failure:
default:
ModelState.AddModelError("", "Invalid login attempt.");
return View(model);
}
}
在我的手机应用程序上,我使用https调用服务器端API。我在这里提供了如何授权用户的示例代码...这段代码已经被修改,以不显示我的实际过程。你必须修改它以满足你的需求。但它确实展示了一种只调用Web服务的方法。
在服务端创建以下属性:
using System.Text;
using System.Security.Cryptography;
using System.Web.Http.Filters;
using System.Web.Http.Controllers;
using System.Net.Http;
public class RequireHttpsAttribute : AuthorizationFilterAttribute
{
public override void OnAuthorization(HttpActionContext actionContext)
{
if (actionContext.Request.RequestUri.Scheme !=Uri.UriSchemeHttps)
{
actionContext.Response = new HttpResponseMessage(System.Net.HttpStatusCode.Forbidden)
{
ReasonPhrase = "HTTPS Required"
};
}
else
{
string UserName;
String Password;
if (actionContext.Request.Headers.Any(p => p.Key == "UserName") &&
actionContext.Request.Headers.Any(p => p.Key == "UserName"))
{
UserName = actionContext.Request.Headers.Where(p => p.Key == "UserName").FirstOrDefault().Value.FirstOrDefault();
Password = actionContext.Request.Headers.Where(p => p.Key == "UserName").FirstOrDefault().Value.FirstOrDefault();
//do authentication stuff here..
If(Authorized())
{
base.OnAuthorization(actionContext);
return;
}
Else
{
actionContext.Response = new HttpResponseMessage (System.Net.HttpStatusCode.Forbidden)
{
ReasonPhrase = "Invalid User or Password"
};
}
}
actionContext.Response = new HttpResponseMessage(System.Net.HttpStatusCode.Forbidden)
{
ReasonPhrase = "HTTPS Required"
};
}
}
return ReasonPhrase;
}
在您的客户端,提出如下请求:
string ResponseText= String.Empty();
using (var client = new HttpClient())
{
client.BaseAddress = new Uri("https://YOURAPI/");
client.DefaultRequestHeaders.Accept.Clear();
//client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue ("text/json"));
client.DefaultRequestHeaders.Accept.Add(
new MediaTypeWithQualityHeaderValue("application/json"));
client.DefaultRequestHeaders.Add("UserName", UserName);
client.DefaultRequestHeaders.Add("Password", Password);
// New code:
HttpResponseMessage response = await client.GetAsync ("api/YOURAPIENDPOINT").ConfigureAwait(continueOnCapturedContext: false);
if (response.IsSuccessStatusCode)
{
ResponseText = await response.Content.ReadAsStringAsync();
}
}
API方法应该如下所示:
[RequireHttps]
public YOURAPI Get(int id)
{
//if you got this far then the user is authorized.
}
你的里程可能会有所不同。我还没有测试过修改后的代码。但是你应该知道如何实现你想要的。
我会考虑JWT/OWIN的组合。基本上,您需要一种机制,在成功登录后发出令牌(OAuth),然后需要一个中间件,该中间件将从任何后续请求的http头中使用令牌承载器,并授予(或拒绝)访问权限(使用标准的[Authorize]
decorator)。下面是如何使用JWT(Json Web令牌)的一个很好的例子。
如果你不熟悉OWIN/武士刀,官网链接上有很好的文章。这将是非常有用的。您基本上只需要两个OWIN中间件,UseOAuthorizationServer和UseJwtBearerAuthentiation,这两个中间件来自几个Nuget包。只要按照上面的例子。
只有在这里完成,你提到在本地移动应用程序中存储令牌beares,确保你把它们存储在Android或iOS的适当位置。
在Postman中,我可以使用 回调URL Auth URL 客户端ID 我如何使用C#代码做同样的事情?
使用邮递员,我可以毫无问题地获得令牌。如果单击和,我会得到以下代码片段: 当我尝试在Rest Assured中对请求建模时,我得到了一个400错误,但不清楚为什么: 我哪里出了问题很明显吗?是否应该将键/值传递到中?
我目前正在使用Postman来生成承载令牌,我正在自动化测试中使用它。现在,我也想使用Java中的REST Assured来自动化承载令牌生成过程。请帮帮我.谢了。
我试图从Web读取JSON数据,但该代码返回空结果。我不确定我做错了什么。
我正在使用Spring Web创建一个rest资源。我用Java创建了类似于Json响应的文档对象。当我使用String.class作为响应类型时,我从请求中获取响应。当我更改对我创建的类的响应时,boy是null。 这是我的httpgetter Json文档 函数调用 JSON响应
我有一个Spring应用程序,它具有keydeport依赖性。前端发送到我的后端承载令牌,我想使用这个令牌从keydeport获取用户名和他的UUID。 这是我的钥匙斗篷配置。 在这个endpoint中,我得到授权头: