对于基本身份验证,我已经实现了一个HttpMessageHandler基于Darin Dimitrov在这里回答的示例的自定义:https://stackoverflow.com/a/11536349/270591
代码创建具有用户名和角色principal的类型实例,GenericPrincipal然后将此主体设置为线程的当前主体:
Thread.CurrentPrincipal = principal;
Run Code Online (Sandbox Code Playgroud)
稍后在ApiController方法中,可以通过访问controllers User属性来读取主体:
public class ValuesController : ApiController
{
public void Post(TestModel model)
{
var user = User; // this should be the principal set in the handler
//...
}
}
Run Code Online (Sandbox Code Playgroud)
这似乎工作正常,直到我最近添加了一个MediaTypeFormatter使用该Task库的自定义,如下所示:
public override Task<object> ReadFromStreamAsync(Type type, Stream readStream,
HttpContent content, IFormatterLogger formatterLogger)
{
var task = Task.Factory.StartNew(() =>
{
// some formatting happens and finally a TestModel is …Run Code Online (Sandbox Code Playgroud) 我试图从客户端传输一个字符串到ASP.NET MVC4应用程序.
但我无法接收字符串,无论是null还是找不到post方法(404错误)
客户端代码传输字符串(控制台应用程序):
HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://localhost:49032/api/test");
request.Credentials = new NetworkCredential("user", "pw");
request.Method = "POST";
string postData = "Short test...";
byte[] byteArray = Encoding.UTF8.GetBytes(postData);
request.ContentType = "application/x-www-form-urlencoded";
request.ContentLength = byteArray.Length;
Stream dataStream = request.GetRequestStream();
dataStream.Write(byteArray, 0, byteArray.Length);
dataStream.Close();
WebResponse response = request.GetResponse();
Console.WriteLine(((HttpWebResponse)response).StatusDescription);
dataStream = response.GetResponseStream();
StreamReader reader = new StreamReader(dataStream);
string responseFromServer = reader.ReadToEnd();
Console.WriteLine(responseFromServer);
reader.Close();
dataStream.Close();
response.Close();
Console.ReadLine();
Run Code Online (Sandbox Code Playgroud)
ASP.NET Web Api控制器:
public class TestController : ApiController
{
[Authorize]
public String Post(byte[] value)
{
return value.Length.ToString();
}
} …Run Code Online (Sandbox Code Playgroud) 我正在尝试制作一个安全的asp.net web api.为此,我按照以下链接
所以现在每个api请求都需要一个令牌,我在请求头中提供了一个令牌,如下所示
public class TestController : Controller
{
public string GetProducts()
{
Uri myUri = new Uri("http://localhost:420420/api/products");
WebRequest myWebRequest = WebRequest.Create(myUri);
myWebRequest.Method = "GET";
myWebRequest.ContentType = "application/json";
myWebRequest.Headers.Add("Authorization-Token", RSAClass.accessToken);
using (WebResponse response = myWebRequest.GetResponse())
{
using (var responseStream = response.GetResponseStream())
{
var reader = new StreamReader(responseStream);
return reader.ReadToEnd();
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
所以我现在能够发出每个api请求,检查标题中的标记.但是我如何完成授权,我的意思是我怎么能不允许这个令牌在同一个控制器中访问某些动作.我只需要一个想法.希望我解释得很好.
编辑:
public class TestController : Controller
{
public string GetProducts()
{
Uri myUri = new Uri("http://localhost:420420/api/products");
WebRequest myWebRequest = WebRequest.Create(myUri);
myWebRequest.Method = "GET";
myWebRequest.ContentType …Run Code Online (Sandbox Code Playgroud) 我正在构建一个asp.net mvc web api应用程序,但不确定如何进行会员资格.
在我目前的项目中,我有这个
我自己Users Table和Role Table我没有使用asp.net会员资格,因为它带来了太多的包袱而且不符合我想要设计我的数据库的方式(我确实可以这样做,但它似乎很多工作)
A user可以有很多角色,role可以有很多用户.
我正在使用EF来完成对数据库的几乎所有调用.
在过去的项目中,我自己Authorize Attribute做了我自己对数据库的调用,并检查用户是否在该控制器/操作方法上允许的正确角色.
通过不做任何会员提供者,我失去了一些内置的功能,如User.IsInRole.我仍然可以使用,User.Identity.Name但我认为这是因为我设置的cookie.
现在在asp.net mvc 4/web api中执行此操作的最佳方法是什么?
谷歌搜索时我找到了"SimpleMembership",但还没读过多少内容.
User.Identity.Name如果我对用户进行身份验证,我可以使用我的webapi吗?
目前,我有一个销售小部件的MVC Web应用程序.用户使用表单身份验证登录我们的系统,然后可以根据他们所属的组执行各种功能(即下订单,查看订单,取消订单等).
我们的任务是编写Api,使第三方能够在我们的系统中创建和查看订单.每个第三方都拥有自己的用户名,并且仅限于基于其所属组的某些api方法.
我们正在考虑使用Web Api作为提供api的机制.我们还希望能够从我们的MVC Web应用程序中使用此API.不幸的是,我们遇到了Web Api身份验证的问题.使用DelegatingHandler,我们已经为WebApi实现了基于SSL的基本身份验证.这对我们的第三方非常有用.但是,当我们尝试从我们的MVC应用程序中使用Api时,我们得到401访问被拒绝错误,因为用户在使用Forms身份验证的MVC应用程序中进行了身份验证,但我们无法将这些凭据传递给Web Api.有没有办法将Forms Auth凭证从我们的MVC应用程序传递到我们的Web api应用程序?
IIS安装WebSite使用两个Web应用程序命名为WidgetStore
我正在尝试为另一个MVC站点访问的MVC Web API配置身份验证。我已经在web.config中尝试了很多东西,所以有很多建议。但是,一切都无济于事。
我正在从MVC网站使用以下代码:
var web = new WebClient();
web.UseDefaultCredentials = false;
web.Credentials = new NetworkCredential(username, password);
Run Code Online (Sandbox Code Playgroud)
然后,我使用该Web客户端在仅包含API控制器的另一个MVC站点上调用方法。没有身份验证,一切都会正常进行,但是我无法使身份验证正常工作。发出请求时,我收到一个异常,返回401(如果您问我,这很好,但它似乎没有发送凭据)。
我还尝试将用户名和密码放在URL中,但这也不起作用。
这是Web API站点的web.config文件的相关部分:
<authentication>
<forms
cookieless="UseUri"
enableCrossAppRedirects="false">
<credentials passwordFormat="Clear">
<user name="site" password="XYZ123!"/>
</credentials>
</forms>
</authentication>
<authorization>
<deny users="?"/>
</authorization>
Run Code Online (Sandbox Code Playgroud)
我只想在其中输入一个用户名/密码,以确保它是调用方法的网站。我的API控制器具有btw的“授权”属性。
我的问题是:如何向Web API网站添加身份验证,以便可以使用身份验证在其上调用方法?
我正在使用带有Web Api的ASP.NET MVC 4
我有以下ApiController.
public class ProductsController : ApiController
{
public List<Product> GetProducts()
{
return _productService.GetAllProducts();
}
public List<Product> GetProductsFromId(string username)
{
return _productService.GetProductsFromUsername(username);
}
}
Run Code Online (Sandbox Code Playgroud)
现在,如果你在GetProductsFromId(string username)这里看到第二个动作,我需要先传递用户名(即从MVC 3升级之前)我User.Identity.Username用来获取用户名.
在这种情况下我应该如何处理这个问题.
如何传递用户名?有什么我可以做的.
此外,我不想User.Identity.Username在GetProductFromId(string username)方法内部使用,因为它将打败使用web api的整个目的,也不会被测试.
请指导我帮助我.谢谢