像slack这样的移动应用程序已经普及了允许用户获得一次性登录链接的想法(Slack将其称为魔术登录链接).
您的想法是输入电子邮件,而不必输入移动密码,您需要一个魔术登录链接,可以通过打开手机上的链接一次登录.
我在asp.net identity 2.1中实现这个,我不确定如何确保生成的链接只能使用一次.
我生成一个这样的标记:
var token = await _userManager.GenerateUserTokenAsync("MyLoginLink",user.Id);
Run Code Online (Sandbox Code Playgroud)
此令牌将添加到用户的URL中.链接重定向到的操作方法检查链接是否对该用户有效,然后将您登录到:
public async Task<ActionResult> LoginLink(string email, string token)
{
var user = await _userManager.FindByNameAsync(email);
// some checks ommited
//check for an expired token:
var result = await _userManager.VerifyUserTokenAsync(user.Id, "MyLoginLink", token);
if (!result)
{
// Failed
return RedirectToAction("Login");
}
await _userManager.UpdateSecurityStampAsync(user.Id);
await SignInAsync(user, true);
Run Code Online (Sandbox Code Playgroud)
现在 - 如果我更新安全标记user.UpdateSecurityStamp,重新生成安全标记,这将使此标记无效,并确保它不能再次使用.问题在于它还会使任何现有登录失效,因此如果用户也登录到桌面,则会强制他们再次注销.
是否有一种相对简单的方法在asp.net身份中创建这样的一次性使用令牌,这不会使所有现有登录失效?
ASP.NET Core根据文件wwwroot的mime类型提供文件夹中的文件.但是如何让它提供没有扩展名的文件呢?
例如,Apple要求您在应用中使用端点/apple-app-site-association进行某些应用集成.如果您将名为apple-app-site-association的文本文件添加到wwwroot中,则无效.
我试过的一些事情:
1)提供没有扩展时的映射:
var provider = new FileExtensionContentTypeProvider();
provider.Mappings[""] = "text/plain";
app.UseStaticFiles(new StaticFileOptions
{
ContentTypeProvider = provider
});
Run Code Online (Sandbox Code Playgroud)
2)添加应用程序重写:
var options = new RewriteOptions()
.AddRewrite("^apple-app-site-association","/apple-app-site-association.txt", false)
Run Code Online (Sandbox Code Playgroud)
没有工作,唯一有效的是.AddRedirect我不愿意使用的东西.
我在我的Mac上安装了新发布的Mono 3和MonoDevelop,我渴望得到一个简单的MVC Web应用程序,使用剃刀视图页面.
当我文件 - 新 - 解决MVC 3 Web应用程序(剃须刀),事情不编译,给出错误:
The type or namespace GlobalFilterCollection could not be found
这是因为2个引用不起作用 - System.Web.Helpers和System.Web.WebPages.当我看着这些在MonoDevelop中的参考文献列表,它们是红色与"集结号不可用" - 看着更详细,似乎我引用system.web.mvc 2.0.0.0引用,而其他一切都是4.0. 0.0.任何人都可以建议吗?
那么什么是ASP.NET Identity的IUserSecurityStampStore <TUser>接口?我们了解到ASP.NET Identity具有安全标记功能,用于使用户登录cookie无效,并强制他们重新登录.
在我的MVC应用程序中,管理员可以归档用户.当拱形时,它们应该立即被注销并被迫再次登录(这将因为它们被存档而拒绝它们).
我怎样才能做到这一点?我知道安全标记是关键.默认设置如下所示:
app.UseCookieAuthentication(new CookieAuthenticationOptions {
AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
LoginPath = new PathString("/Account/Login"),
Provider = new CookieAuthenticationProvider {
// Enables the application to validate the security stamp when the user logs in.
// This is a security feature which is used when you change a password or add an external login to your account.
OnValidateIdentity = SecurityStampValidator.OnValidateIdentity<ApplicationUserManager, ApplicationUser>(
validateInterval: TimeSpan.FromMinutes(30),
regenerateIdentity: (manager, user) => user.GenerateUserIdentityAsync(manager))
}
});
Run Code Online (Sandbox Code Playgroud)
通过实验,如果我将validateInterval设置为1分钟,然后在数据库中手动破解用户安全标记,那么他们将被迫重新登录,但仅在该时间段过去之后.
有没有办法让这个瞬间,或者只是将间隔设置为一个低时间段并等待(或实现我自己的OnValidateIdentity检查每个请求)
谢谢
asp.net authentication asp.net-mvc asp.net-mvc-5 asp.net-identity
我正在尝试更新构建服务器上的数据库,但它失败了,因为它正在尝试运行自动迁移,即使它们已被禁用.数据库已经存在,我只需要应用最新的迁移.这是我的背景:
public sealed class Configuration : DbMigrationsConfiguration<CableSenseInstanceConfiguratorContext>
{
public Configuration()
{
AutomaticMigrationsEnabled = false;
}
}
Run Code Online (Sandbox Code Playgroud)
我手动创建了一堆迁移文件,这是最新的:
public partial class Settings : DbMigration
{
public override void Up()
{
AddColumn("dbo.MasterInstances", "Settings", c => c.String());
}
public override void Down()
{
DropColumn("dbo.MasterInstances", "Settings");
}
}
Run Code Online (Sandbox Code Playgroud)
如果我然后从包管理器控制台手动更新数据库,我看到它尝试运行自动迁移(由于该表已存在而失败):
Applying code-based migrations: [201204200805145_NoMoreCerts, 201210311451543_SuperUsers, 201301041036414_Settings, 201301041128583_Settings2].
Applying code-based migration: 201204200805145_NoMoreCerts.
Applying automatic migration: 201204200805145_NoMoreCerts_AutomaticMigration.
Run Code Online (Sandbox Code Playgroud)
我的__MigrationHistory表只有初始创建的一个条目.如何阻止它进行自动迁移?
我有一个包含.net mvc网站和webjob的解决方案.
我使用git部署 - 所以在git push to azure上,我的网站升级了.我现在只是添加一个将按计划运行的控制台应用程序.我正试图弄清楚如何在网站上部署这个git push,但我不知道该怎么做.
我知道我可以创建一个文件夹website\app_data\jobs\triggered\webjob并将文件复制到那里(比如来自webjob上的后期构建事件),但这意味着我需要将所有这些文件提交到git repo以便部署来获取它们 -这也意味着每次我建立时,Git都会促使我再次犯下它们 - 呃.
有没有更好的方法来做到这一点 - 我可以将我的回购推广到azure,它将正确部署我的网站和我的webjob?
谢谢
我在azure上有一个MVC网络应用程序,每天有几百次,我得到了一个The required anti-forgery cookie "__RequestVerificationToken" is not present.未处理的异常日志.
我已正确设置一切,我的动作方法有[ValidateAntiForgeryToken].
我可以通过查看表单中存在令牌的异常详细信息看到,但cookie不存在.
有人知道是什么原因引起的吗?
这是完整的错误.
System.Web.Mvc.HttpAntiForgeryException (0x80004005): The required anti-forgery cookie "__RequestVerificationToken" is not present.
at System.Web.Helpers.AntiXsrf.TokenValidator.ValidateTokens(HttpContextBase httpContext, IIdentity identity, AntiForgeryToken sessionToken, AntiForgeryToken fieldToken)
at System.Web.Helpers.AntiXsrf.AntiForgeryWorker.Validate(HttpContextBase httpContext)
at System.Web.Helpers.AntiForgery.Validate()
Run Code Online (Sandbox Code Playgroud) 在MVC 5中,您可以在其中执行类似的操作IActionFilter,以检查是否已在当前操作(或控制器范围)上声明属性
public void OnActionExecuting(ActionExecutingContext filterContext)
{
// Stolen from System.Web.Mvc.AuthorizeAttribute
var isAttributeDefined = filterContext.ActionDescriptor.IsDefined(typeof(CustomAttribute), true) ||
filterContext.ActionDescriptor.ControllerDescriptor.IsDefined(typeof(CustomAttribute), true);
}
Run Code Online (Sandbox Code Playgroud)
因此,如果你的控制器像这样定义属性,这是有效的.
[CustomAttribute]
public ActionResult Everything()
{ .. }
Run Code Online (Sandbox Code Playgroud)
是否可以在ASP.NET Core MVC(内部IActionFiler)中执行相同的操作?
首先,这类似于:
如何使用html子元素在contenteditable div中获得插入位置?
基本上,我正在写一些类似于推特中的新推文编辑器.里面div有contentEditable设置,我解析的文字.当我发现我认为是URL的时候,我将该文本删除并输入<a>div内的标签(例如输入的信息go to www.google.com变为Go to <a href='..'>www.google.com</a>.但是,当我这样做时,插入位置会丢失.
使用@Tim-Down在其他SO帖子中的建议只有在您不编辑DOM时才会起作用(正如他所说).我正在编辑DOM,因此插入位置丢失了.
是否有可能(理想情况下不使用引用的Rangy库)通过处理当前代码来实现这一点.
我目前的代码(来自其他SO帖子):
var saveSelection, restoreSelection;
if (window.getSelection) {
// IE 9 and non-IE
saveSelection = function(win) {
var sel = win.getSelection(), ranges = [];
if (sel.rangeCount) {
for (var i = 0, len = sel.rangeCount; i < len; ++i) {
ranges.push(sel.getRangeAt(i));
}
}
return ranges;
};
restoreSelection = function(win, savedSelection) {
var sel = win.getSelection();
sel.removeAllRanges();
for …Run Code Online (Sandbox Code Playgroud) 对于本地开发测试,我需要捕获所有请求www.somedomain.com/XXX(其中X是路径),并将它们发送到localhost/somevdir/XXX.
我已将此添加到我的HOSTS文件(c:\ windows\system32\drivers\etc)中:
127.0.0.1 www.mydomain.com
Run Code Online (Sandbox Code Playgroud)
然后,在IIS8(Windows 8)中,我为主机www.mydomain.com添加了绑定到我的"默认网站".这有效,我现在可以浏览www.mydomain.com/test.html并查看测试html页面.我的虚拟目录位于默认网站内.然后我在网站上添加一个URL重写URL以获取最后一点:
<rewrite>
<rules>
<rule name="mydomain.com" stopProcessing="true">
<match url="^www.mydomain.com/(.*)" />
<action type="Rewrite" url="localhost/MyVDir/{R:1}" logRewrittenUrl="true" />
</rule>
</rules>
</rewrite>
Run Code Online (Sandbox Code Playgroud)
但是 - 这不起作用.我得到一个404,所以看起来比赛永远不会发生.我尝试过重定向和重写,我试过没有正则表达式中的^和其他一些正则表达式的调整.谁能解释我做错了什么?
asp.net-mvc ×3
asp.net-core ×2
azure ×2
asp.net ×1
cookies ×1
dom ×1
iis ×1
iis-8 ×1
javascript ×1
kudu ×1
mono ×1
monodevelop ×1
web-config ×1