我正在编写一个使用MVC4的Web API,应该由多个客户端类型使用.我想使用OpenID进行身份验证.
我已经下载了DotNetOpenAuth NuGet包,但到目前为止所有示例都是针对客户端应用程序而不是API.
我的问题很简单.我想让客户端向我的API发送身份验证请求.API使用OpenID提供程序进行身份验证.然后,API会设置它需要的任何内容,以便在整个Web api调用中使用[Authorize]标记.
我知道在.NET应用程序中,可以调用FormsAuthentication.SetCookie,但这对于其他语言来说也是一个易于实现的解决方案吗?
问题简而言之.如何将OpenID集成到MVC4 web api中,以允许使用可由多种语言调用和使用的Authorize标记?
我遇到了一个问题,当我尝试使用OfType()方法对我的odata服务进行linq查询时,我收到一条错误消息,指出该请求对于版本2服务无效.我创建了WCF数据服务并将MaxProtocolVersion设置为v3.
public class TestDirectorySearch : DataService<TestDirectoryEntities>
{
public static void InitializeService(DataServiceConfiguration config)
{
config.SetEntitySetAccessRule("*", EntitySetRights.AllRead);
config.SetEntitySetPageSize("*", 50);
config.UseVerboseErrors = true;
config.DataServiceBehavior.MaxProtocolVersion = System.Data.Services.Common.DataServiceProtocolVersion.V3;
}
}
Run Code Online (Sandbox Code Playgroud)
我的edmx有以下几行:
<edmx:DataServices m:DataServiceVersion="1.0"
m:MaxDataServiceVersion="3.0"
xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata">
Run Code Online (Sandbox Code Playgroud)
当我尝试执行以下查询时,我收到一条错误消息,指出当MaxProtocolVersion小于'3.0'时,不支持"方法'OfType'."
from test in context.Tests.OfType<OrderableTest>()
where test.TestRevisionId.Equals(mmt.RevisionId)
select new
{
Reflex = test.ReflexTest
, ShipTemp = (test.SpecimenTemperature == null) ? null : test.SpecimenTemperature.DisplayDescription
}).FirstOrDefault();
Run Code Online (Sandbox Code Playgroud)
如果我检查上下文的MaxProtocolVersion,则将其设置为v2.这在什么时候失败了?我该怎么做才能正确设置?
确切的错误:
{"当MaxProtocolVersion小于'3.0'时,不支持'OfType'方法."}
请求的堆栈跟踪:
at System.Data.Services.Client.ResourceBinder.AnalyzeOfType(MethodCallExpression mce, DataServiceProtocolVersion maxProtocolVersion)
at System.Data.Services.Client.ResourceBinder.VisitMethodCall(MethodCallExpression mce)
at System.Data.Services.Client.ALinqExpressionVisitor.Visit(Expression exp)
at System.Data.Services.Client.DataServiceALinqExpressionVisitor.Visit(Expression exp)
at System.Data.Services.Client.ALinqExpressionVisitor.VisitExpressionList(ReadOnlyCollection`1 original)
at System.Data.Services.Client.ALinqExpressionVisitor.VisitMethodCall(MethodCallExpression m)
at System.Data.Services.Client.ResourceBinder.VisitMethodCall(MethodCallExpression …Run Code Online (Sandbox Code Playgroud) 如果用户当前在控制器和参数引用的操作中,是否打算@ Url.Action方法返回当前url?
我有一个简单的控制器设置.
OrderableTest/Details/Id
ResultableTest/Details/Id
Run Code Online (Sandbox Code Playgroud)
如果我@Url.Action("Details", "Orderable")从家庭控制器打电话(Home/Index)或从Resultable/Details我那里得到正确的URL保存到javascript变量("/Orderable/Details").但是,如果我在"详细信息"页面上,则ID将包含在网址中.例如,我在页面上Orderable/Details/12345,我打电话@Url.Action("Details", "Orderable"),而不是让"/Orderable/Details"我得到"/Orderable/Details/12345".这是预期的功能吗?
路由映射是默认的.
Javascript按要求:
var orderableDetailUrl = '@Url.Action("Details", "Orderable")';
var resultableDetailUrl = '@Url.Action("Details", "Resultable")';
alert(orderableDetailUrl);
alert(resultableDetailUrl);
Run Code Online (Sandbox Code Playgroud) 当我的页面加载我的ValidationSummary和ValidationMessageFor(model => model.TestNumbersString)时,尽管只是几乎没有加载页面,但都显示验证错误.我已经检查过.css文件是在我的_Layout.cshtml中引用的,并且它的样式是存在的.
Model.cs
[Required]
public string TestNumbersString { get; set; }
Run Code Online (Sandbox Code Playgroud)
HomeController.cs
public ActionResult Index(TestModel model)
{
return View(model);
}
Run Code Online (Sandbox Code Playgroud)
partialView.cshtml
@using (Html.BeginForm("Index", "Home", FormMethod.Post, new { @class = "form" }))
{
@Html.TextAreaFor(model => model.TestNumbersString, new { @class = "testBox" })
@Html.ValidationMessageFor(model => model.TestNumbersString)
}
Run Code Online (Sandbox Code Playgroud)
我注意到我的布局有很多javascript和css文件,但其他验证在页面上工作,我知道site.css是为页面的其他部分加载的(但不是我的表单,但这是另一个问题).
_Layout.cshtml
<script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" type="text/javascript"></script>
<link href="@Url.Content("~/Content/Site.css")" rel="stylesheet" type="text/css" />
Run Code Online (Sandbox Code Playgroud)
到目前为止我所做的故障排除让我发现验证消息的类是字段验证错误.因此我认为它不是.css错误(即使css样式没有正确应用).
我还想明确这是一个局部布局.在处理验证时,我不确定这是否会导致其他问题.
感谢@jacqijvv的解决方案.
public ActionResult Index()
{
TestModel model = new TestModel();
return View(model);
}
[HttpPost]
//We have these separate …Run Code Online (Sandbox Code Playgroud) 你能通过实体框架设计器生成TPC继承结构吗?我已经设法通过Code First获得TPC继承结构,但是我连接的数据库有一个很好的20个关系表.我不想先通过代码管理所有这些关系.
如果那是不可能的,是否可以通过代码优先生成.EDMX然后通过设计器编辑?