您好,我一直在尝试在我的MVC6 Web应用程序上实现WS-Fed SSO,我已经阅读了一些关于身份验证的内容以及所有来确定我的要求.我必须使用WsFederationAuth,所以没有oauth或saml协议对我有用.
编辑:在@Pinpoint建议之后我尝试使用owin中间件来实现连接,但是我将使用完整的框架DNX451而不是DNXCore,但它等待Vnext支持ws-fed.
public static class AppBuilderExtensions
{
#if !DNXCORE50
public static IApplicationBuilder UseOwinAppBuilder(this IApplicationBuilder app,
Action<IAppBuilder> configuration)
{
if (app == null)
{
throw new ArgumentNullException(nameof(app));
}
if (configuration == null)
{
throw new ArgumentNullException(nameof(configuration));
}
return app.UseOwin(setup => setup(next =>
{
var builder = new AppBuilder();
var lifetime = (IApplicationLifetime) app.ApplicationServices.GetService(typeof (IApplicationLifetime));
var properties = new AppProperties(builder.Properties);
properties.AppName = app.ApplicationServices.GetApplicationUniqueIdentifier();
properties.OnAppDisposing = lifetime.ApplicationStopping;
properties.DefaultApp = next;
configuration(builder);
return builder.Build<Func<IDictionary<string, object>, Task>>(); …Run Code Online (Sandbox Code Playgroud) 我部分嘲笑有这两种方法的类:
public void EmitTo(string connectionId, ChatMessage message)
{
Clients.Client(connectionId).broadcastMessage(message.User.UserName, message.Message);
}
public virtual void Broadcast(ChatMessage message)
{
Clients.All.broadcastMessage(message.User.UserName, message.Message);
}
Run Code Online (Sandbox Code Playgroud)
在我的测试中,[SetUp]我有这些电话:
hub = Substitute.ForPartsOf<ChatHub>(myMockedClient, context, groupManager);
hub.When(x => x.Broadcast(Arg.Any<ChatMessage>())).DoNotCallBase();
hub.When(x => x.EmitTo(Arg.Any<string>(), Arg.Any<ChatMessage>())).DoNotCallBase();
Run Code Online (Sandbox Code Playgroud)
我Broadcast在调用该方法时调用此行或稍后调用没有问题(它们没有按预期执行任何操作)但奇怪的是我的第三行抛出错误:
System.ArgumentException:参数不能为null或为空参数名称:connectionId
我有点迷失,因为我对两种方法做了完全相同的事情并获得了不同的行为,为什么我的when方法调用EmitTo?
尝试恢复进程时遇到问题.我去应用发射一束的过程,当它崩溃的过程是那里在开放,当我重新运行我的应用我想我的恢复过程.在Windows上,一切都按预期工作,我可以wait()在进程kill()上等...但在linux中它只是通过我wait()没有任何错误.这是代码
func (proc *process) Recover() {
pr, err := os.FindProcess(proc.Cmd.Process.Pid)
if err != nil {
return
}
log.Info("Recovering " + proc.Name + proc.Service.Version)
Processes.Lock()
Processes.Map[proc.Name] = proc
Processes.Unlock()
proc.Cmd.Process = pr
if proc.Service.Reload > 0 {
proc.End = make(chan bool)
go proc.KillRoutine()
}
proc.Cmd.Wait()
if proc.Status != "killed" {
proc.Status = "finished"
}
proc.Time = time.Now()
channelProcess <- proc
//confirmation that process was killed
if proc.End != nil {
proc.End <- true
}
} …Run Code Online (Sandbox Code Playgroud) 解:
你可以找到:这里
- 如果在操作之前尚未打开连接,则对象上下文将打开该连接.如果对象上下文在操作期间打开连接,则它将始终在操作完成时关闭连接.
- 如果手动打开连接,则对象上下文不会关闭它.调用Close或Dispose将关闭连接.
问题是EF会打开和关闭SetUserContext的连接,所以我会松开CONTEXT_INFO.为了保持它,我需要手动打开连接并在SaveChanges之后关闭它
public int SaveChanges(string modifierId)
{
Database.Connection.Open();
SetUserContext(modifierId);
var changes = base.SaveChanges();
Database.Connection.Close();
return changes;
}
Run Code Online (Sandbox Code Playgroud)
题 :
该系统适用于数据仓库.数据库必须知道谁修改它并保存Audit表中的任何更改.
为了达到这个结果,我主要依靠触发器和程序:
此函数将userId保存在CONTEXT_INFO中:
CREATE PROCEDURE [dbo].[SetUserContext]
@userId NVARCHAR (64)
AS
BEGIN
SET NOCOUNT ON;
DECLARE @context VARBINARY(128)
SET @context = CONVERT(VARBINARY(128), @userId)
SET CONTEXT_INFO @context
END
Run Code Online (Sandbox Code Playgroud)
这个可以在任何地方使用来获取userId:
CREATE FUNCTION [dbo].[GetUserContext] ()
RETURNS NVARCHAR (64)
AS
BEGIN
RETURN CONVERT(NVARCHAR (64), CONTEXT_INFO())
END
Run Code Online (Sandbox Code Playgroud)
例如,在我的触发器中,我有:
CREATE TRIGGER UpdateUser
ON [dbo].[Users]
FOR UPDATE
AS
BEGIN
INSERT INTO [Audit_Users]
SELECT …Run Code Online (Sandbox Code Playgroud) c# ×2
.net ×1
adfs ×1
asp.net ×1
asp.net-core ×1
go ×1
linux ×1
mocking ×1
nsubstitute ×1
nunit ×1
sql ×1
unit-testing ×1
wcf ×1
windows ×1